{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/kellydingzx/ecg_notebooks/blob/main/res-Copy_of_pantompskin.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fRjCYnF-R6ZS"
      },
      "source": [
        "## Imports "
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!wget -r -N -c -np https://physionet.org/files/nsrdb/1.0.0/"
      ],
      "metadata": {
        "id": "G4cejnbiTk5b"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "ELuJyYZER6ZU"
      },
      "outputs": [],
      "source": [
        "import pip\n",
        "import os\n",
        "\n",
        "try:\n",
        "    import wfdb\n",
        "except ModuleNotFoundError:\n",
        "    pip.main(['install', \"wfdb\"])\n",
        "    import wfdb\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "4CSWi4tnR6ZU"
      },
      "outputs": [],
      "source": [
        "import sys\n",
        "\n",
        "import numpy as np\n",
        "from scipy import signal, ndimage"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def pan_tompkins(input_signal, sampling_frequency, low, high):\n",
        "    filtered_singal = bandpass_filter(input_signal, low, high,sampling_frequency)\n",
        "    moving_avg = moving_window_integration(squaring(derivative(filtered_singal, sampling_frequency\n",
        "                                            )), int(0.15*sampling_frequency))\n",
        "    moving_avg[: int(0.2 * sampling_frequency)] = 0\n",
        "    peaks = detect_peaks(moving_avg, sampling_frequency)\n",
        "\n",
        "    return peaks\n",
        "\n",
        "def detect_peaks(detection, sampling_rate=1000, **kwargs):\n",
        "    \"\"\"Based on https://github.com/berndporr/py-ecg-detectors/\n",
        "    Optimized for vectorized computation.\n",
        "    \"\"\"\n",
        "    min_peak_distance = int(0.3 * sampling_rate)\n",
        "    min_missed_distance = int(0.25 * sampling_rate)\n",
        "\n",
        "    signal_peaks = []\n",
        "\n",
        "    SPKI = 0.0\n",
        "    NPKI = 0.0\n",
        "\n",
        "    last_peak = 0\n",
        "    last_index = -1\n",
        "\n",
        "    peaks, _ = signal.find_peaks(detection, plateau_size=(1, 1))\n",
        "    for index, peak in enumerate(peaks):\n",
        "        peak_value = detection[peak]\n",
        "\n",
        "        threshold_I1 = NPKI + 0.25 * (SPKI - NPKI)\n",
        "        if peak_value > threshold_I1 and peak > last_peak + min_peak_distance:\n",
        "            signal_peaks.append(peak)\n",
        "\n",
        "            # RR_missed threshold is based on the previous eight R-R intervals\n",
        "            if len(signal_peaks) > 9:\n",
        "                RR_ave = (signal_peaks[-2] - signal_peaks[-10]) // 8\n",
        "                RR_missed = int(1.66 * RR_ave)\n",
        "                if peak - last_peak > RR_missed:\n",
        "                    missed_peaks = peaks[last_index + 1 : index]\n",
        "                    missed_peaks = missed_peaks[\n",
        "                        (missed_peaks > last_peak + min_missed_distance)\n",
        "                        & (missed_peaks < peak - min_missed_distance)\n",
        "                    ]\n",
        "                    threshold_I2 = 0.5 * threshold_I1\n",
        "                    missed_peaks = missed_peaks[detection[missed_peaks] > threshold_I2]\n",
        "                    if len(missed_peaks) > 0:\n",
        "                        signal_peaks[-1] = missed_peaks[np.argmax(detection[missed_peaks])]\n",
        "                        signal_peaks.append(peak)\n",
        "\n",
        "            last_peak = peak\n",
        "            last_index = index\n",
        "\n",
        "            SPKI = 0.125 * peak_value + 0.875 * SPKI\n",
        "        else:\n",
        "            NPKI = 0.125 * peak_value + 0.875 * NPKI\n",
        "\n",
        "    return signal_peaks\n",
        "\n",
        "def moving_window_integration(signal, window_size):\n",
        "    window_size = int(window_size)\n",
        "\n",
        "    mwa = ndimage.uniform_filter1d(signal, window_size, origin=(window_size - 1) // 2)\n",
        "\n",
        "    head_size = min(window_size - 1, len(signal))\n",
        "    mwa[:head_size] = np.cumsum(signal[:head_size]) / np.linspace(1, head_size, head_size)\n",
        "    return mwa\n",
        "\n",
        "def squaring(input_signal):\n",
        "    return np.square(input_signal)\n",
        "\n",
        "def derivative(input_signal, sampled_frequency):\n",
        "    return derivative_difference_equation(input_signal, sampled_frequency)\n",
        "\n",
        "def bandpass_filter(input_signal, low, high, sampling_freq):\n",
        "    return highpass_filter(lowpass_filter(input_signal, high, sampling_freq), low, sampling_freq)\n",
        "\n",
        "def lowpass_filter(input_signal, cutoff, sampling_freq):\n",
        "    return low_pass_scipy_butterworth(input_signal, cutoff, sampling_freq)\n",
        "\n",
        "def highpass_filter(input_signal, cutoff, sampling_freq):\n",
        "    return high_pass_scipy_butterworth(input_signal, cutoff, sampling_freq)\n",
        "\n",
        "def derivative_numpy(input_signal, sampling_frequency):\n",
        "    return np.diff(input_signal)\n",
        "\n",
        "# y(n) = (1/8)*T \n",
        "#        *[-x(n-2) -2*x(n-1) +2x(n+1) +x(n+2)]\n",
        "def derivative_difference_equation(input_signal, sampled_frequency):\n",
        "    derived_signal = input_signal.copy()\n",
        "    for index in range(len(input_signal)):\n",
        "        derived_sample = derived_signal[index]\n",
        "        if (index >= 2): derived_sample -= input_signal[index-2]\n",
        "        if (index >= 1): derived_sample -= 2*input_signal[index-1]\n",
        "        \n",
        "        if (index < len(input_signal)-1): derived_sample += 2*input_signal[index+1]\n",
        "        if (index < len(input_signal)-2): derived_sample += input_signal[index+2]\n",
        "    \n",
        "    derived_signal = derived_signal / ((1/8)*(1/sampled_frequency))\n",
        "    return derived_signal\n",
        "\n",
        "def low_pass_scipy_butterworth(input_signal, cutoff_freq, sampling_freq):\n",
        "    sos = signal.butter(2, cutoff_freq/(sampling_freq/2), 'low', output='sos')\n",
        "    filtered_signal = signal.sosfilt(sos, input_signal)\n",
        "    return filtered_signal\n",
        "\n",
        "def high_pass_scipy_butterworth(input_signal, cutoff_freq, sampling_freq):\n",
        "    sos = signal.butter(1, cutoff_freq/(sampling_freq/2), 'high', output='sos')\n",
        "    filtered_signal = signal.sosfilt(sos, input_signal)\n",
        "    return filtered_signal"
      ],
      "metadata": {
        "id": "Tbju7xTzSin_"
      },
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "h5IcQzxER6ZV"
      },
      "source": [
        "## Run Method"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "! pip install neurokit2\n",
        "import neurokit2 as nk2"
      ],
      "metadata": {
        "id": "J5Nzcmm3sbg0",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "cc65df93-f376-40cd-a4cf-673ac9a11aa0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
            "Collecting neurokit2\n",
            "  Downloading neurokit2-0.2.3-py2.py3-none-any.whl (1.2 MB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m20.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.8/dist-packages (from neurokit2) (3.2.2)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.8/dist-packages (from neurokit2) (1.22.4)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (from neurokit2) (1.3.5)\n",
            "Requirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.8/dist-packages (from neurokit2) (1.0.2)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.8/dist-packages (from neurokit2) (1.7.3)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.8/dist-packages (from scikit-learn>=1.0.0->neurokit2) (1.2.0)\n",
            "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from scikit-learn>=1.0.0->neurokit2) (3.1.0)\n",
            "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->neurokit2) (2.8.2)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->neurokit2) (1.4.4)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.8/dist-packages (from matplotlib->neurokit2) (0.11.0)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->neurokit2) (3.0.9)\n",
            "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas->neurokit2) (2022.7.1)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.8/dist-packages (from python-dateutil>=2.1->matplotlib->neurokit2) (1.15.0)\n",
            "Installing collected packages: neurokit2\n",
            "Successfully installed neurokit2-0.2.3\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def get_peaks(sample_path, leads, fs):\n",
        "    signal, rest = wfdb.rdsamp(sample_path, sampfrom=0, sampto=None, \n",
        "                                channel_names = leads)\n",
        "    cleaned = nk2.ecg_clean(signal, fs, method='pantompkins1985')\n",
        "    signals, info = nk2.ecg_peaks(cleaned, fs, method='pantompkins1985')\n",
        "\n",
        "    return info[\"ECG_R_Peaks\"]"
      ],
      "metadata": {
        "id": "HlQrJlCTsa5r"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Low pass methods"
      ],
      "metadata": {
        "id": "k2eru3swWXMG"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "spath = '/content/physionet.org/files/nsrdb/1.0.0/16272'\n",
        "print('Clean Signal')\n",
        "peaks, real_peaks = run_pantompkins(spath, 'ECG1', 5, 11, 360, 3000)\n",
        "evaluation(peaks, real_peaks, int(150/(1000/360)))"
      ],
      "metadata": {
        "id": "8LkeyzkRWWe3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jsdkTEqfR6ZX"
      },
      "source": [
        "## Run on Whole Dataset"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/gdrive')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "R1D8cnc8uTWa",
        "outputId": "673184e0-a9e4-4803-f511-f7d04e1a110b"
      },
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mounted at /content/gdrive\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "kdl7ToxsR6ZX"
      },
      "outputs": [],
      "source": [
        "arr = os.listdir('/content/physionet.org/files/nsrdb/1.0.0')\n",
        "\n",
        "sample_ids = []\n",
        "for file in arr:\n",
        "    if '.atr' in file:\n",
        "      current_id = int(file[:5])\n",
        "      if current_id not in sample_ids:\n",
        "        sample_ids.append(current_id)\n",
        "sample_ids.sort()\n",
        "        "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ENyLPmidR6ZY"
      },
      "outputs": [],
      "source": [
        "root_folder = '/content/physionet.org/files/nsrdb/1.0.0/'\n",
        "sensitivity = []\n",
        "ppv = []\n",
        "f1 = []\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "for id in sample_ids:\n",
        "  for lead in ['ECG1', 'ECG2']:\n",
        "    \n",
        "    sample_path = root_folder + str(id)\n",
        "    peaks = get_peaks(sample_path, [lead], 128)\n",
        "    annots = wfdb.rdann(sample_path, 'atr', sampfrom=0, sampto=None)\n",
        "\n",
        "    model_save_name = str(id)+'-'+lead+'.npz'\n",
        "    path = F\"/content/gdrive/My Drive/2peaks/{model_save_name}\" \n",
        "    np.savez(path, detected = peaks, ref = annots.sample)\n",
        "\n",
        "    print(id, lead)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6EXwk7Q7uG92",
        "outputId": "af6823f6-9127-44ba-aa84-9ded3e25c424"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "16265 ECG1\n",
            "16265 ECG2\n",
            "16272 ECG1\n",
            "16272 ECG2\n",
            "16273 ECG1\n",
            "16273 ECG2\n",
            "16420 ECG1\n",
            "16420 ECG2\n",
            "16483 ECG1\n",
            "16483 ECG2\n",
            "16539 ECG1\n",
            "16539 ECG2\n",
            "16773 ECG1\n",
            "16773 ECG2\n",
            "16786 ECG1\n",
            "16786 ECG2\n",
            "16795 ECG1\n",
            "16795 ECG2\n",
            "17052 ECG1\n",
            "17052 ECG2\n",
            "17453 ECG1\n",
            "17453 ECG2\n",
            "18177 ECG1\n",
            "18177 ECG2\n",
            "18184 ECG1\n",
            "18184 ECG2\n",
            "19088 ECG1\n",
            "19088 ECG2\n",
            "19090 ECG1\n",
            "19090 ECG2\n",
            "19093 ECG1\n",
            "19093 ECG2\n",
            "19140 ECG1\n",
            "19140 ECG2\n",
            "19830 ECG1\n",
            "19830 ECG2\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def evaluation(peaks, real_peaks, interval):\n",
        "    check_peaks = peaks.copy()\n",
        "    n_ref = len(real_peaks[1:])\n",
        "    n_detected = len(peaks)\n",
        "    count = 0\n",
        "    for i in range(n_ref):\n",
        "        correct = real_peaks[1:][i]\n",
        "        condition = (check_peaks>=correct-interval) & (check_peaks<=correct+interval)\n",
        "        found = np.array(check_peaks)[condition]\n",
        "        if len(found) >= 1:\n",
        "          for f in found:\n",
        "            check_peaks.remove(f)\n",
        "          count += 1\n",
        "    sensitivity = count/n_ref\n",
        "    ppv = count/n_detected\n",
        "    f1 = 2*ppv*sensitivity/(ppv+sensitivity)\n",
        "    result = {\"sensitivity\": str(sensitivity*100)+'%',\n",
        "              'PPV': str(ppv*100)+'%',\n",
        "              'F1': str(f1*100) + '%'\n",
        "              }\n",
        "    return result"
      ],
      "metadata": {
        "id": "I45jSaUYu6Cj"
      },
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd"
      ],
      "metadata": {
        "id": "lvGGTXEtu6m3"
      },
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_sen = pd.DataFrame(0.0, index=sample_ids, columns=['ECG1', 'ECG2'])\n",
        "df_ppv = pd.DataFrame(0.0, index=sample_ids, columns=['ECG1', 'ECG2'])\n",
        "df_f1 = pd.DataFrame(0.0, index=sample_ids, columns=['ECG1', 'ECG2'])"
      ],
      "metadata": {
        "id": "mDFooQiovezX"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_sen = pd.read_csv(\"/content/gdrive/My Drive/2peaks/sen.csv\" )\n",
        "df_ppv = pd.read_csv(\"/content/gdrive/My Drive/2peaks/ppv.csv\" )\n",
        "df_f1 = pd.read_csv(\"/content/gdrive/My Drive/2peaks/f1.csv\" )\n",
        "\n",
        "df_ppv.set_index('Unnamed: 0')\n",
        "df_sen.set_index('Unnamed: 0')\n",
        "df_f1.set_index('Unnamed: 0')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 645
        },
        "id": "5-bMEKIXSXSt",
        "outputId": "3ea6623a-8a80-43d4-88e1-751ce4f305fa"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                 ECG1       ECG2\n",
              "Unnamed: 0                      \n",
              "16265       99.765185  99.644795\n",
              "16272       35.998264  33.175891\n",
              "16273       99.857727  99.843316\n",
              "16420       99.827898  99.800536\n",
              "16483       99.892774  99.892773\n",
              "16539       99.818861  99.809648\n",
              "16773       84.140309  84.141555\n",
              "16786       99.947879  99.914454\n",
              "16795       99.548605  99.545179\n",
              "17052       99.746527  99.729467\n",
              "17453        0.000000   0.000000\n",
              "18177        0.000000   0.000000\n",
              "18184        0.000000   0.000000\n",
              "19088        0.000000   0.000000\n",
              "19090        0.000000   0.000000\n",
              "19093       94.695706  94.687760\n",
              "19140       99.908155  99.902997\n",
              "19830       99.598002  99.592742"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-02e77734-8393-4116-bedd-a9ad85ef884a\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ECG1</th>\n",
              "      <th>ECG2</th>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>Unnamed: 0</th>\n",
              "      <th></th>\n",
              "      <th></th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>16265</th>\n",
              "      <td>99.765185</td>\n",
              "      <td>99.644795</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16272</th>\n",
              "      <td>35.998264</td>\n",
              "      <td>33.175891</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16273</th>\n",
              "      <td>99.857727</td>\n",
              "      <td>99.843316</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16420</th>\n",
              "      <td>99.827898</td>\n",
              "      <td>99.800536</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16483</th>\n",
              "      <td>99.892774</td>\n",
              "      <td>99.892773</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16539</th>\n",
              "      <td>99.818861</td>\n",
              "      <td>99.809648</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16773</th>\n",
              "      <td>84.140309</td>\n",
              "      <td>84.141555</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16786</th>\n",
              "      <td>99.947879</td>\n",
              "      <td>99.914454</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16795</th>\n",
              "      <td>99.548605</td>\n",
              "      <td>99.545179</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17052</th>\n",
              "      <td>99.746527</td>\n",
              "      <td>99.729467</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17453</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18177</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18184</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19088</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19090</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19093</th>\n",
              "      <td>94.695706</td>\n",
              "      <td>94.687760</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19140</th>\n",
              "      <td>99.908155</td>\n",
              "      <td>99.902997</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19830</th>\n",
              "      <td>99.598002</td>\n",
              "      <td>99.592742</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-02e77734-8393-4116-bedd-a9ad85ef884a')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-02e77734-8393-4116-bedd-a9ad85ef884a button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-02e77734-8393-4116-bedd-a9ad85ef884a');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "for id in sample_ids[10:15]:\n",
        "\n",
        "  for lead in ['ECG1', 'ECG2']:\n",
        "    model_save_name = str(id)+'-'+lead+'.npz'\n",
        "    path = F\"/content/gdrive/My Drive/2peaks/{model_save_name}\" \n",
        "    saved = np.load(path, allow_pickle=True)\n",
        "    peaks = list(saved['detected'])\n",
        "    real_peaks = list(saved['ref'])\n",
        "    res = evaluation(peaks, real_peaks, int(150/(1000/128)))\n",
        "    df_sen.loc[id, lead] = float(res['sensitivity'][0:-1])\n",
        "    df_ppv.loc[id, lead] = float(res['PPV'][0:-1])\n",
        "    df_f1.loc[id, lead] = float(res['F1'][0:-1])\n",
        "\n",
        "    df_sen.to_csv(\"/content/gdrive/My Drive/2peaks/sen.csv\" )\n",
        "    df_ppv.to_csv(\"/content/gdrive/My Drive/2peaks/ppv.csv\" )\n",
        "    df_f1.to_csv(\"/content/gdrive/My Drive/2peaks/f1.csv\" )"
      ],
      "metadata": {
        "id": "xySdVRbVvaBF"
      },
      "execution_count": 14,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_ppv"
      ],
      "metadata": {
        "id": "JzMVH1pmKTvV",
        "outputId": "66a588d0-dc5d-446d-907e-41130e3c7b9a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 771
        }
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "       Unnamed: 0        ECG1       ECG2\n",
              "0         16265.0  100.000000  99.810177\n",
              "1         16272.0   95.084424  98.291335\n",
              "2         16273.0  100.000000  99.961061\n",
              "3         16420.0   99.994123  99.957890\n",
              "4         16483.0   99.996167  99.997125\n",
              "5         16539.0   99.996306  99.984302\n",
              "6         16773.0  100.000000  99.995122\n",
              "7         16786.0   99.999016  99.951801\n",
              "8         16795.0   99.997698  99.991944\n",
              "9         17052.0   99.997716  99.970312\n",
              "10        17453.0    0.000000   0.000000\n",
              "11        18177.0    0.000000   0.000000\n",
              "12        18184.0    0.000000   0.000000\n",
              "13        19088.0    0.000000   0.000000\n",
              "14        19090.0    0.000000   0.000000\n",
              "15        19093.0  100.000000  99.986710\n",
              "16        19140.0  100.000000  99.992770\n",
              "17        19830.0   99.995470  99.952021\n",
              "17453         NaN   99.997020  99.940430\n",
              "18177         NaN   99.994837  99.971208\n",
              "18184         NaN   99.805988  99.998046\n",
              "19088         NaN   99.992975  99.832623\n",
              "19090         NaN   99.992649  99.984074"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-40412cd8-fc36-47bb-933b-6ca532100a94\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Unnamed: 0</th>\n",
              "      <th>ECG1</th>\n",
              "      <th>ECG2</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>16265.0</td>\n",
              "      <td>100.000000</td>\n",
              "      <td>99.810177</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>16272.0</td>\n",
              "      <td>95.084424</td>\n",
              "      <td>98.291335</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>16273.0</td>\n",
              "      <td>100.000000</td>\n",
              "      <td>99.961061</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>16420.0</td>\n",
              "      <td>99.994123</td>\n",
              "      <td>99.957890</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>16483.0</td>\n",
              "      <td>99.996167</td>\n",
              "      <td>99.997125</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>16539.0</td>\n",
              "      <td>99.996306</td>\n",
              "      <td>99.984302</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>16773.0</td>\n",
              "      <td>100.000000</td>\n",
              "      <td>99.995122</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>16786.0</td>\n",
              "      <td>99.999016</td>\n",
              "      <td>99.951801</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>16795.0</td>\n",
              "      <td>99.997698</td>\n",
              "      <td>99.991944</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>17052.0</td>\n",
              "      <td>99.997716</td>\n",
              "      <td>99.970312</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>17453.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>18177.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>18184.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>19088.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>19090.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>19093.0</td>\n",
              "      <td>100.000000</td>\n",
              "      <td>99.986710</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>19140.0</td>\n",
              "      <td>100.000000</td>\n",
              "      <td>99.992770</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>19830.0</td>\n",
              "      <td>99.995470</td>\n",
              "      <td>99.952021</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17453</th>\n",
              "      <td>NaN</td>\n",
              "      <td>99.997020</td>\n",
              "      <td>99.940430</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18177</th>\n",
              "      <td>NaN</td>\n",
              "      <td>99.994837</td>\n",
              "      <td>99.971208</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18184</th>\n",
              "      <td>NaN</td>\n",
              "      <td>99.805988</td>\n",
              "      <td>99.998046</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19088</th>\n",
              "      <td>NaN</td>\n",
              "      <td>99.992975</td>\n",
              "      <td>99.832623</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19090</th>\n",
              "      <td>NaN</td>\n",
              "      <td>99.992649</td>\n",
              "      <td>99.984074</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-40412cd8-fc36-47bb-933b-6ca532100a94')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-40412cd8-fc36-47bb-933b-6ca532100a94 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-40412cd8-fc36-47bb-933b-6ca532100a94');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df_sen.to_csv(\"/content/gdrive/My Drive/2peaks/sen.csv\" )\n",
        "df_ppv.to_csv(\"/content/gdrive/My Drive/2peaks/ppv.csv\" )\n",
        "df_f1.to_csv(\"/content/gdrive/My Drive/2peaks/f1.csv\" )"
      ],
      "metadata": {
        "id": "ksHiJsCnw5NI"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_sen = pd.read_csv(\"/content/gdrive/My Drive/3peaks/sen.csv\" )\n",
        "df_ppv = pd.read_csv(\"/content/gdrive/My Drive/3peaks/ppv.csv\" )\n",
        "df_f1 = pd.read_csv(\"/content/gdrive/My Drive/3peaks/f1.csv\" )"
      ],
      "metadata": {
        "id": "wjxOYQc4NFQG"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df_sen"
      ],
      "metadata": {
        "id": "mQj7k52ONIOw",
        "outputId": "ba8203b0-0a48-409e-c062-2062fbc71c7a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "    Unnamed: 0  Unnamed: 0.1       ECG1       ECG2\n",
              "0            0       18177.0  99.305146  99.308565\n",
              "1            1       16773.0  72.621705  72.626134\n",
              "2            2       16483.0  99.780987  99.780031\n",
              "3            3       19140.0  99.817509  99.796888\n",
              "4            4       18184.0  99.710726   0.000000\n",
              "5            5       17052.0   0.000000   0.000000\n",
              "6            6       16795.0   0.000000   0.000000\n",
              "7            7       19090.0   0.000000   0.000000\n",
              "8            8       17453.0   0.000000   0.000000\n",
              "9            9       16420.0   0.000000   0.000000\n",
              "10          10       19093.0   0.000000   0.000000\n",
              "11          11       16786.0   0.000000   0.000000\n",
              "12          12       16539.0   0.000000   0.000000\n",
              "13          13       16272.0   0.000000   0.000000\n",
              "14          14       19088.0   0.000000   0.000000\n",
              "15          15       19830.0   0.000000   0.000000\n",
              "16          16       16265.0   0.000000   0.000000\n",
              "17          17       16273.0   0.000000   0.000000\n",
              "18       16483           NaN  99.780987  99.780031\n",
              "19       16539           NaN  99.638365  99.633764\n",
              "20       16773           NaN  72.621705  72.626134\n",
              "21       16786           NaN  99.892862  98.018440\n",
              "22       16795           NaN  99.103528  99.109230\n",
              "23       17052           NaN  99.494324  99.480688\n",
              "24       17453           NaN  99.505792  99.488001\n",
              "25       18177           NaN  99.305146  99.308565\n",
              "26       18184           NaN  99.710726  99.701961\n",
              "27       19088           NaN  84.533293  84.490876\n",
              "28       19090           NaN  99.586343  99.586343\n",
              "29       19093           NaN  89.925779  88.361281\n",
              "30       19140           NaN  99.817509  99.796888\n",
              "31       19830           NaN  99.178516  99.207277"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-5c102a84-d8bd-4edd-b5b7-623c2a55151b\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Unnamed: 0</th>\n",
              "      <th>Unnamed: 0.1</th>\n",
              "      <th>ECG1</th>\n",
              "      <th>ECG2</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>18177.0</td>\n",
              "      <td>99.305146</td>\n",
              "      <td>99.308565</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1</td>\n",
              "      <td>16773.0</td>\n",
              "      <td>72.621705</td>\n",
              "      <td>72.626134</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2</td>\n",
              "      <td>16483.0</td>\n",
              "      <td>99.780987</td>\n",
              "      <td>99.780031</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>19140.0</td>\n",
              "      <td>99.817509</td>\n",
              "      <td>99.796888</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>4</td>\n",
              "      <td>18184.0</td>\n",
              "      <td>99.710726</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>5</td>\n",
              "      <td>17052.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>6</td>\n",
              "      <td>16795.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>7</td>\n",
              "      <td>19090.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>8</td>\n",
              "      <td>17453.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>9</td>\n",
              "      <td>16420.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>10</td>\n",
              "      <td>19093.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>11</td>\n",
              "      <td>16786.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>12</td>\n",
              "      <td>16539.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>13</td>\n",
              "      <td>16272.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>14</td>\n",
              "      <td>19088.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>15</td>\n",
              "      <td>19830.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>16</td>\n",
              "      <td>16265.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>17</td>\n",
              "      <td>16273.0</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>16483</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.780987</td>\n",
              "      <td>99.780031</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19</th>\n",
              "      <td>16539</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.638365</td>\n",
              "      <td>99.633764</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>20</th>\n",
              "      <td>16773</td>\n",
              "      <td>NaN</td>\n",
              "      <td>72.621705</td>\n",
              "      <td>72.626134</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>21</th>\n",
              "      <td>16786</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.892862</td>\n",
              "      <td>98.018440</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>22</th>\n",
              "      <td>16795</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.103528</td>\n",
              "      <td>99.109230</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>23</th>\n",
              "      <td>17052</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.494324</td>\n",
              "      <td>99.480688</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>24</th>\n",
              "      <td>17453</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.505792</td>\n",
              "      <td>99.488001</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25</th>\n",
              "      <td>18177</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.305146</td>\n",
              "      <td>99.308565</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>26</th>\n",
              "      <td>18184</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.710726</td>\n",
              "      <td>99.701961</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>27</th>\n",
              "      <td>19088</td>\n",
              "      <td>NaN</td>\n",
              "      <td>84.533293</td>\n",
              "      <td>84.490876</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>28</th>\n",
              "      <td>19090</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.586343</td>\n",
              "      <td>99.586343</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>29</th>\n",
              "      <td>19093</td>\n",
              "      <td>NaN</td>\n",
              "      <td>89.925779</td>\n",
              "      <td>88.361281</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>30</th>\n",
              "      <td>19140</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.817509</td>\n",
              "      <td>99.796888</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>31</th>\n",
              "      <td>19830</td>\n",
              "      <td>NaN</td>\n",
              "      <td>99.178516</td>\n",
              "      <td>99.207277</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5c102a84-d8bd-4edd-b5b7-623c2a55151b')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-5c102a84-d8bd-4edd-b5b7-623c2a55151b button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-5c102a84-d8bd-4edd-b5b7-623c2a55151b');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "np.average(df_sen['ECG1']), np.average(df_ppv['ECG1']), np.average(df_f1[ 'ECG1'])"
      ],
      "metadata": {
        "id": "seWHCF6AnvGV",
        "outputId": "e3a49e23-9e2a-4b49-c063-e51cd1137934",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(91.70034828436637, 99.864941706209, 94.1523959953412)"
            ]
          },
          "metadata": {},
          "execution_count": 39
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "np.average(df_sen['ECG2']), np.average(df_ppv['ECG2']), np.average(df_f1[ 'ECG2'])"
      ],
      "metadata": {
        "id": "GYK9wpUHocrw",
        "outputId": "12e020b4-d88b-4171-9463-347a1a90bdee",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(91.70034828436637, 99.864941706209, 94.1523959953412)"
            ]
          },
          "metadata": {},
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "weNOd6jwR6ZY"
      },
      "outputs": [],
      "source": [
        "def to_float(arr):\n",
        "    ret = []\n",
        "    for x in arr:\n",
        "        ret.append(float(x[0:-1]))\n",
        "    return ret "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CD9itEcYR6ZY",
        "outputId": "429d50d9-0bb0-48b8-be36-c4cb6e941a2e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 453
        }
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n"
            ],
            "text/html": [
              "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.\n",
              "</pre>\n"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x7fc8553361c0>"
            ]
          },
          "metadata": {},
          "execution_count": 41
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1080x360 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAE9CAYAAACyU3u7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3wVVfr48c+5LTe9dwgktARCbwoICAoIIkXFXrBgX3Rd61d/sruKKCqiLmAvWHFFXAWEAIqItNB7CwRIQkjv5Zb5/TEhEBKEQJKbxOf9euWVZM6UJ5O5M/PMOXOO0jQNIYQQQgghhBDNi8HVAQghhBBCCCGEqHuS7AkhhBBCCCFEMyTJnhBCCCGEEEI0Q5LsCSGEEEIIIUQzJMmeEEIIIYQQQjRDkuwJIYQQQgghRDNkcnUAFyMoKEhr3bq1q8MQQgghhBBCCJfYuHFjpqZpwTWVNelkr3Xr1iQmJro6DCGEEEIIIYRwCaVU8tnKpBmnEEIIIYQQQjRDkuwJIYQQQgghRDMkyZ4QQgghhBBCNEOS7AkhhBBCCCFEMyTJnhBCCCGEEEI0Q5LsCSGEEEIIIUQzJMmeEEIIIYQQQjRD9ZbsKaU+UkqdUErtOG1agFIqQSm1v+K7f8V0pZR6Syl1QCm1TSnVo77iqlfb5sGMeJjip3/fNs/VEZ2bxFz/mlq8IDE3lKYWc1OLt6lqivu5qcXc1OKFphmzaBhybNS/JryP67Nm7xNgxBnTngaWa5rWDlhe8TvAVUC7iq9JwOx6jKt+bJsHP/4N8o4Cmv79x7817oOhicb8v4R/MMzbQZfWLRjm7eB/Cf9ovDE3tXihyca8cNkTVWJeuOyJRh9zk/r8NcV9DCz89XmGfRRPl0/iGfZRPAt/fd7VIf25Jvr5a2rHclPcx00u5qaqqd3UN7XPH3JebmhK07T6W7lSrYGfNE2Lr/h9LzBY07Q0pVQ48KumaR2UUu9W/PzVmfP92fp79eqlJSYm1lv8tTIjvuKDdgaPQLj6TfCJgBa99Gl7FoGjTP/55P73awUteuo/75gPmrPqegLbQER3cDpgx3dVlwUIiYPwLmArhZ3fA1rVeSK6QWgnKCuAnQv0aQnPQ0lO9Zjd/eHKf1Wd1qq/HkPhCdi7uPoyMYPAvzXkHYMDy6uXt7tS3wc5hyFpZfXyDiPBKxgyD0Dy6urlcaPBI4Dv3+zAVF8TpYZTzyncnE4ezXdy6+TdkLaVwqPrsGmOKosbOo3H1ysUUjaSl7oR+xnlps434uvuD0fWkXd8C7bT978yYu56A75uvnB4NdknduA4vdxkwRJ/nV6e9CuZGXtwopf/vOZ13vK1UnZGvJPzSrnq0idQCpTVF2vcGDzMHrB3MXn5x/TNAgqF8gjCEjsSi9GCtvMHykoyK8qVPo93BIZ2V2I0GNG2fYtWXnRqeaXALwraXK5vfMtXp469kwLbQusB+s8bP+WHlf/iRX9rlX1sdTp5Jt/J+MueOW1BpX8Li9ePTVsp7JxfvTy8y6ljb8+iiiJ1ap6I7hDUFkpy4cCy6uWRPcG/FRRlweFV1ctb9GLh3GFM8dCqxTyloJxRd/2hH1t5KZBScb44/bMTPRA8AvRjM2VTxcTTytteAVZfyNwPaVurLx87EiyekL4Ljm+vvnyncWByg9TNcGL3qeWXPsdCQykz/f04bjISZncwOSeXUU4rDHtRn89ghK436j8nr4GcQ1RhcoP4a/WfD63SP3+ns3hCx2v0nw/+AoXpVcutftCh4pnc/mVQnFW13DNQ//uBhW+1Z4q3ufo+LlaMemiHfl6wFQOq4v+jwCcSWvbWZ963BBy2U2UAvi304wNgf4K+X04v92sJwR3A6YRDFeeNKuVREBCtr/fo+mrlC/d8y5TUpZQaTh4vFTEH9WdUt3v08653KJQXnfrfnf6/DWwDXiFQmgfHd1BNcKy+j4qzIX1nxcTTlg+N14+twgw4sat6eUR3/djKT4WMPQB8/7/7mOpnqbafn80tZ9zVs6rGGH0ZmN0h66B+fJ553m97BZgs+nGXdbB6eezVYDDox3X2oarlygCdxuq/H90Aucmn4tY0fb0dx+i/T28LRRnV949vS3hsBxz6Tb92nKSUfuy1Har/nrTy1LXo5P/PI+DUeSlpJZQXnlxYn8cj6NSxlbQS7GVVzwteIaeOrUO/gdPOyePi+x8nMdW3hn2cV87A4a/j0Jwon3BUYBsMmob5yFq8je4AFDtK9S34R2MIaovBbsNweBXGk8fkyX0Y1F4/fsqL9M/emfs+LB4CYvTzXtKv1csrz3uZkPQrC5Y9xUt+ZzkvT95dfd+LC3MycbKVnJpmdofRb0GXCede/uT/Tylw2MFp0+/nTv+y+unlpfn68XFmuX9rvbwgXf9cnF4Gp47rrIP65+6b21hIYfVricEHbvwSlFH/PBuMYLLqxyVAfpp+P3CyXBn0a4pHgF5eVqD/PQZj1XUYjBe1ixf++jxTDn1/xnlZY0r0OEYN/nftV6hpFV8OQIHRpF8zygv0e2bNeeq7mxe4eYO9XL9nryyrKPeO0M/pZYX6OV1zgubg+wUTazxnNKbPn1Jqo6ZpvWosa+BkL1fTNL+KnxWQo2man1LqJ2Capmm/V5QtB57SNK1aJqeUmoRe+0dUVFTP5OTkM2dxjSl+VLmIn6njGJjwmf7ztFZQmlu1vNstMLbiQv6vwIoL02n63AcjX9VvqF8Krb7+yx6Hof9PvzBMb1O9fOgLcNnf9RvamV3P9686Zexs6HYzHFkLHw2vXj5hrn5TuX8ZfHFt9fLbvoc2Q/RE89s7qpffvUy/cG/+HH54qHr5A2sgtCPDPogjzWyqVmzQNNqXvsf4wq/4w2MRv3p6VClv4RGJe8bz3Fr4MT/5rGSDu7VKeVuf9jhTHmNS4WzmBmxgp5tblfJOAd0oPDyJxwrf4M2g3Ry2mKuUdwu8lIwDt/J80VT+X1gyJ0zVY/wzA0JHkXHoGqZmP8a1LYqrlQ8Jv46C1JE8m3o34yKrH2cjIm/DlnklDyXdwPhIt2rlY6LuQ+UN5pbdI7kp3KfytkRpoAxGxsc8iqW4HyM3XsaNESFoSlVbR7jNzvSMTP4eEoRCbxZg0MBg9eWWzi8SZo/AJ2EwUwP99XKtYh6fCO7qNZ2ocgs5/7uCOf6+qJNlgApqxyOXvUlUcSE7513F195ep9YPqIgePHnlO4RmHeL3r8awyNMTA9qp8pjLWZW2hvQa9rmXw8nNrUcwadBU3PYsYv2P97HDzYJRAyP6cWPsN5kJlzyB2vIFW39+jCMmk14GGDUNy8jXGBR/K6ydw/7lz5FtNFSUgRENt5vnEdvqcvhtOsdXvkyxQWHUwICGSQPzQ+sJCmgLCS9Q/MdMnOjbXurhzotBAdUuHk9l5TC0uASHArvRDdNjOwhyD4Lv7ydp17eUKoUDhV2B3eqLzx0L6RDQAb6+hVXJyyhVCrtS2AGHZxCR4z+id1hv+GwMX2QmUnba8g7PEDoOn86QqCE43x/CtJIkfbunLX/ZoCmMjB7JsI86cryGfezncPDddZswftCD59zLOZlqGTQNvMO5esAUBkQMpmBmG171MlUcd5o+n39rxg9+iUvCL+HYy6HM8vXSj0kqyoM7cP2QV+ni156kVyP5zMcHVfG/VwDh3bhh6HTaWfzZ/2Ys87099fVXfH3n7UXRafv3JE+nk/EFhWitB3LH0OmEFWSy8eMhLPbywIl+JtdQaK3787crZhJwYh+rvh7LEk8PnEpVlIMWdSl/u+xtvI+u44+f72Kp5+nLg9aiN4/0mYV30hJ+X/MPlnu441QV6wZURHcmdZ5DwL5vWLnrJVZ6uLPD4obNUPPnb+mx1KoTH92hJ8S/TYcVL1ZbhicP6TduCS/A6jerlz+fCUYzLHwcNnxQtczoBs9XJGjz74NtX1ct9wiEJ5P0n6f4Vl83AAqm5MJnYyoSmtOExsMDFQ/23h966kHMSS37wt1L9Z//07cyGa7UZijcVvFw6Y1OkH/Gg44q19woPWGvMLRlRI3n6HCbnWCHg23WqufQbqVlzE3TH5SMiwzjgMVSpbxfcQnvpuvJ7ogWEaSZ9DOIpgwoFMML83g1I6uyvMCgcBjccRitGDQn43LTeDpbT3ZHtgjHiaLcEoDD7IXRUcaEzIPM9/Kq8doXbrOztMiiJ9a+LU59dRipJ7yVD1BENaV5+oOQ/FQoSNO/J35YNdE7SRn0BzOaE+5ZoT+gXPceLH3ujGRMg8d2gW8krHwVfnmp+rqePqKva+nz8Mdb1cv/X7aeUP30GCR+VLXM5A7PHdd//u5e2D6PhZ4eTKnhWjIlM5u48nKcnHbO8onE964lhHmGwSdXszt1bcWj6Yp5AtsQdMv3hHuF43hvMNuz9IdYlefE0E6ET/iCCK8IbLMuYUvhUTSl0JR+vGsR3Yga/R8ivSIpnjOATeVZoBSaMup3yJE9mZKTSIax+jHp53DwRNAldL/8n7T0bkn6jDhWmDUcmoYDJw407JG9GDL4ZVq5B3J0Rnt+8HLDqYFdgRNFcWhXrugzlS4ePiR/1IOvfbxxol/TnECBbzuu7DiVQb4W9n57BZ/6euNUYEfhVJBvDWdY1KuMD3aQuPg63vfzwYHiuMmI8yz3RUvvkWSvNWdJ9ip+z9E0zb82yd7pmkTNnlco3DofrD76U2iAE3v0k8LpTyGtPnrNF0DGvlPLn5zH6qufuJ3O6k/3Qa+N8wjQn1DkHqm6LEpf3t1Pf9JUUFFh+uGVp34+nXc43LOs+votnvrT06LM6st4BOhPv2yl1WsHQL8xMFuhvLjm2kTPIP2JUnmR/qTzTF4hYDTT5ZP4GhMRNI3Otg9wdxZRrDZRqvRtxIX7EB/pi9Eayk9/ROLhLKSARMpUPgqIj/QlNswHg1sEi9aF4eEoII/12JReO9a1pR9tQ7zA3IqlG4LwdOSRzTrsSn+627NVAK0CPdFMrVm+KQAvRy4nWIuTcgC2q/k1X2g1jTjnGPq3DSLYx50yRxuWbfbG25ZNmnGlfmLVNIbEBhPg7U5RWVsWJ3rh7Ugn0+139M+txvBOYfh4upNX1J6f1rvj60wl12MNoOFEY0zXCNytbmTlxvHDOjf8OUqhz1rQQENjfM9ILGYLqSfi+X6tiUDjYUrazKoxZqVpuCfdQ3nABpRyYjDAsI4hOA1GTqQN4NdtZkLcd1AWsAGlNMxG6B3tj9NgJDdtJOt3Gwjx3ExJ4DoA3EyKDmFeOA1GitImsPMgBHmvoTgoEdCwmBQRflacBgNa+iSOHHPg7/sruf6JULF+b6sJpzKQWZJ51v2slIHhXu9DcRlHnJ+zizXVZpsc8wMWWz6/ZM0isbhquYfJg5mXLsJqz+fdPVP5PWdtlfIgayCLxi3HYstj8m+Ps/JE1XNSK+8ofhq/EIqzmbjiIRKzaqgh+hO9w3rz0fCPoCiTUYtv5khR1c9s/4iBPNxxKo784zy06W7y7HlVygeGX0lnt4cwFaYzK/MRbBXH5kkDQkdTmDIGj9I01nu8BBhAM+DvYcVqMtPKeiU/r+6Id4enzvrZK9jzClGmgxS0+AHQQEFMkAfKYCBAG8XS9S1oY9lOTotFaBUPxVr4u4MyEOS8ll82RRDrvp70iASU0ssDvSxoykBLbmfDzlDaW1dxKFRvNaAUeFmNaErRVj3I3gOBRFkT2BP4a2W52agocZSd9bjwNFlRykiLsidJO2Ym2GMhhwM2gQYmg8LbakYZzGjHHyEzzUG4/1IyAnYACjeTkUBPC8roRsaB+ynNKSE4IIEcP/3c7Wk2E+LjhjK5s3vLXZhLCggISCDf5zBo4OtuIcLPHYPFm5WrbiBAy8M7cBnFnsco9kg9a8yf9XyWrn5tMaiKdDcsXj9v5qedOpefft4Pjdefcuennap5q1LeSf89P+2MmjX0m9vgDvrP+Wn6U/7Tyw1GvWYK4PU4KDgjEYVTNXt5x/Rzv/6HnKoZPLl8dpJ+7ThZBvr15GQNRMZesJdWlFWUW7z1G26AtG3gKK/cT4B+zTpZfnRD5QPUdw79wLvJC6vHin6Oe6LFnWw8nk6JwYMCoy8Oh4Pw8jxeuHQE/h5uvL7tZ7akpVOk3ClUHmhOO+E2O+9cOR4fdzNPrf2GHemZFOJGMW7gdBBSbua762/DajZy14o57M3IoQgLJZoZI3YCS31ZNXESKMX4n6dxNLeIUizYMGLETnBZJNnBP9f4+VOaxjavvvo+zjum/x80J0z6Va853jRXT0jOTAZ73qHvI1sJGC0XXVvTaJys5TEY9HuVfUsqkrlU/TjOT4HhU/Va8d0/wTe3nFrWZNWPs7PpM0n/XAz4u94iIPkP2Pdz1ZoxZYBLH9TvuY6shSNrqpYpA/ScqN8PHd0A6TsqpqtT5V1u1ONP2aQ/oD99WYPpVGuM4zug6ASXr3yETGP1h1phdicFbu4UndGaZ1D41TwQ/zSdihPpvPrRasv1CxrHTW0fpk9xAn23TatW3sPnesa1vpsBhV9yedJn1co7mG/kmuhbGJQzk6szllUrP9cDCLecW7mp41gGFbzExMLN1cpLjt7Ggz1H0tvxDpOz1ui305re2smhmSk4didPDRhIB+dcpqb/Tn6JHaXp58xSzUpuym38+4q+RDKfd9P+4FhWKfp1T1GIJ7lpE3jz6p74G5by1bH17DhWQK7PwbPeF227s3bX9PrSmJK95tuM82Kr/l2hicVsd9rp93E/SkzVn7q5291Zf/d6F0T15/p82KdJxQt/HvOiG1bhdGrYnRoOp0bLAL0GNSW3hNzicpxOsDudOJwaBoOiR5Q/ANuO5XIiv6xyOYemYTUZGNYpDICEXemk5ZVgd+jldqdGoKeFCb1bAvDZmsOk5JZU2XZUgAf3XKbfLPb6oA9l5uoxu9ncSbxnPTe+t4b0/DLK7DbKneWU2+1cHhvEC9fE4dScDHw5keJyB8pYCIZSlHIysnMYjwyNQdM0Rkw/CIDBcgJlKgScjIgP5aa+LSi3w12z9QTL5HEIs1s+JgMM7RjMwPaBOB0W3lvsjcVkoMyyGc2Ug0FppBm+q2yNWIUGgWU3MLh9KJ0jAygs8mDGj0ZKbQ7slj1oyg6agUeGtOfSmBAOpyue+lq/kTe4VTzx1Qy8cm03+rUJYe2BIh7/ej8AZnMpbkYzbiYz79/elx5RAazYk87bKw5gNRlxMxsqvz85IpZIP3c2Juewcu8Jvjxy21n38WOdv8Wp6Q8oNA2cmsbNfaNwMxlZl5TF1mO5FeV6GcADg9pgMChW7Eln69E8NE3T50HDoBSPD9MTjR+2pLDtWF6VZa1mI09fFQvA3LXJ7ErNw+nUl3VqEOBp4dmRcQz9oBMnzNVvgkJsTpbfoz+xnrPyICk5JRgUGAwKo1JEBXpw+6WtAfhk9SFyim0YlMJo0OdpFeDJqC7hAMxLPEqpzYFBqcp5WgZ40K9NEACLt6fh0DSMSqGUwmjQH2J0itBrw1YfyEQpMFaUPbh8RI2fP70qECI8IxgZM5KR0SNp59+uhgPIBRrptaTcUc6qY6v4KeknHuv5GFE+UaxJWcuDSx7AbrRXm98V52WnU8PmdOJm0pOtwjI7JeUO7E5n5fnQqWnc+L8h53ctOflA1ytEfxCQvAZ2/PdUMph3VK/R+sd+fZ5fp+k1UD6Rem3UyWRw0NN6QlJUUftrPVvtbQNyOvTmwEaL3tSuKAvWvF3xsCNVT+ry02DEy3oym7oZ3husL+seoP+NPuF6S6ioS/Tm1Wlb9Wne4Xry+2bnmh/cn3xw0ci8v+193tr01lmvJTMun8Gby/ewJ62AkzM5bQG0841lyWMDWXFkBdMW7+FgRhEn20Ro5f50DevAf++/hLVpa3n2++0cyynRyzV9+f6tOvDxxB5sydjCP77dQnaRDZPBgEEpzM4ghrZvz/Oj27Enew/PL9hJqd2BURkwGhTFpqlkmqqflwPsTuI83sDD5Megdi0Y2TmEnNI8Zv1yCKPBiMVowmwwYTGa6NU6kEtiAim1Ofh24zFMBv38aTYqjAYDHcO9aRviTanNwfpD2ZgMCpNR377JoIj0dyfIy40yu4O03FJMRoXJYKhch4fFhMVkqLymXfJx30Z/L9eYkr3pQJamadOUUk8DAZqmPamUGgU8DIwE+gJvaZrW51zrb1TJHugXvOX/0k+ovi30ZpWNMGmqoonEnF6Uzr0J91KS14ETzgSchlPv3BmcRsa3epwXhtzmwghr9s8Vc5mf/HqTiReaZsy933yVct8vq8VsybuZDY8+ec7lS20OyuxOyu1Oyh36d0+LkRAfK06nxrpD2ZXT9XkctAn2oksLP0ptDj5efbhyus2hUW53MqhDMJd3CCG7qJxn52+vsnyZw8kBy9MYLNVrsZ3lfvQxvc6d/aMZ1D6YYznFvP9bElazETeTAbeK70NiQ4gJ9iKrsIyNyTm4mY1YTQZ9PrOBlv4eeLqZsDmc2Bz6zaSxhuaBDbWPXeGuNyay3X99teZNnXP68NHfP3ZhZGd3ts9fafpYxndvTY5hLWvT1uLQHDze83HujL/TdcGerpFcSzRNY/OJzfyU9BNLDi8hvzyfQGsgk7s+z6i2l2MxGfjb/z5kZdbbTeocV6fn5dJ8/b0lpeDw7/o7hacng8VZ8PRRvXbph4dh81xw86lICFvoNbIjX9XXlXVQr23yidCTwjOd73FRXnyqKaW7v15rXV4M3086VXNdcFx/t2rQ03D5M3ri90ac/p7VyYTNJwI6joWovnpLpPxUfbrZWn2bNWmkDy5OV2ovRSmFm9GNhOQEHlv+NMpYXm0+Z7kfO+9dxZqDWWQVlVUkRAZMRoW3m4lerfV38/alF1Bqc1QkQnq5h8VIuK/+nmpusb5uPRHSEyKjUhgu8HrSnM7Ljemc4ZJkTyn1FTAYCALSgReABcA8IApIBiZompZd8f7eO+i9dxYDE8/VhBMaYbIn6kVeWR53LL6D48XHeXvwu8z5Yy0b8r7AaczB4PDn2uh7G82HrSb/XDGX7w6932TihaYX84LNKTy79FNUwGKUORfN5oeWfRVTh93B2O6Rrg6vRr3ffJUS369RBlvlNM1pxj3vxkaZPDXFfbxgcwrzEp4lPSCRDJMi2K4Rmt2LCVdObbQxQ/XP34iIiaSmdOT3A5nc1T+ah64IZWnyUvqG9SXGL4Y/Uv/g3a3v6u9Wth6Gv9Xf1X9Cgyu2FeNh9iCvLI/B8wZjNpgZEjWEUdGjSD7WgqmL9jJpYAyPXtEeaHrnOKgaM5qR6+vrRtPp1BM90JPBlE1688eTyaAy6M1EAeaOg4MrAKUnVb6ReucyV72iJ04/PFy1UzCjGXrfq9e+gV7zlp1U5Z1Kut8GY97R43j3Mv01D5/IimQuHFr00TspOb3JZl1qJA8uzuTUnCw6tIi3Nr3Fde2vY1KXSQD0evMVSn2/aVLXkuZwXm5s5wyX1ezVN0n2mr9iWzH3JtzLnqw9zL5iNn3Cz1nhK/6iFmxOYfqSvaTmlhDh584Twzs06gtHU02emtI+hqYZc000TePL9Ufo3TqA9qF68yQ3kwGlFCuPrmTGxhkczDuISZnoF9mvMvEzG2qobWkmskqy+Pnwz/x48EcsRgufXaW/P7Q+bT3xQfEUlhh48rtt/Lo3g/5tA5l+XVci/NxdHPXFG/7Od4R4BjJ34mBXhwJH1kHm3opEMEVPBr3DYPx7Z+/LwOQGz1V0/vPj5FM1gydr6ALa6B0PiUobjm/gtcTX2JW1i7iAOJ7o/QS2wmg6t/Bl+e4Tci0RkuyJpsnmsPHIikdYk7aGJ7q9xNzlPsy4oRsdI3xcHZoQdUIueOJCTf56M9lF5Uy7tguRfu5omsa+nH0sPLSQxYcWY3faWXbdMowGI0l5SbT0btlsEr81qWv4bNdnrEldg0NzEBcQx9UxV3Nbx9v04WaAX/ee4NFvtlBqc/DMVXHcdkmrC2521ticKCglwMOCqYZOORqVs/ZSXtFLqzgv/9nyH+ZsnUOYZxh/6/43RsWMYvnuDB74fCM39Yni32Pj5Voi/jTZq13/8EI0IKPBSJRPFMNbD2fxmjBSc7MI8z3PdvdCNAFju0fKBVnUmqZp9GodwMuLdjN8xm88f3UcE3q1pENABzoEdODRHo+SWpiK0WDE4XRw75J7KXeWM6zVMEbFjKJbSLeKHj2bBofTwfrj6+kU1Akfiw/J+ckczD3IxPiJjIoeRVv/ttWWCfZ2o32IN9Ou7UxMsJcLoq4/AZ4m3t/2LrEBsVwedbmrwzk73xZn6eykRcPH0sRkl2YDEGANYFCLQbgZ3bg17lasJisr9qTz4Bcb6RThwxMj9I6s5Foi/ozU7IlGR9M08sry8LPqo3RsTM7h2tl/8PiV7XlkaCPpfU4IIVzsaHYxT/x3K2uTshnUPpjp13UhxKfqAzGH08GqlFUsSlrEL0d/odRRSrhnOH/v9XdGtB7hosjP7WRN5Y8Hf2TRoUVklGTwwqUvcF3767A5bBgNxmoJ68p9Gaw5mFXZU6umaZU1fc3JifxSRi0YTveQnrw34g1Xh3N2TaCzk8amzFHG57s+54PtHzC89XCm9JtSpXzlvgzu/TSR9mFefHH3Jfh6NI/aenHxpGZPNCmzts7i+/3f89WorwhyD+KVn/cQ5OXGXQOiXR2aEEI0Gi0DPPjynkuYuzaZOSsP1jiP0WBkcMvBDG45mGJbMcuPLGfRoUX4mPXm8El5Saw4soKroq8i0qtx1AwU24q5ZdEtHMg9gEmZGNBiAKNjRjOo5SAAzGf0+lhUZmfqot18se4I7UO9eHhIW7zcTM0y0QMwGw0U5IWzy7jd1aH8uZMJXSPs7KSxcWpOFh9azMxNM0krSmNQi0Hc3vH2KvPYHE5e+GEHbUO8+PzuvpLoifMmyZ5oVL7Y/QVzts5hXNtxBLkH8cfBLNYfyuZfYzrh6SaHqxBCnM5gUNzRrzU39mmJm8mI06nxRsI+bru0FaFn1PJ5mD0Y3WY0o9uMrpy2Pm09MzfNZOammXQP6V7ZsUuANaDB/oaC8gKWJS8jvTid+7vej4fZg24h3bixw43n7F008XA2j3+7lcjjnrkAACAASURBVCPZxUwaGMPfr2yP1dxMBgg/C39PCx5aG/LsO8kuzW7Q/1WtdZkgyd15mL11NnO2ziEuII5/9/83fcP7VpvHbDTw2V198bKa8POwuCBK0VRJM07RaPyU9BPPrHqGIS2H8Prg1zEZTDicGj9tS+Wq+HAsNQzCKYQQ4pRdqfmMn70ai9HAlGs6Ma575DlruI4VHOPnwz+zMGkhB3IP4GX2YuUNK7EYLfXWFNLmtLE6ZTU/Jf3Er0d/pcxRRjv/dnx79bcYDeeXrBWW2ek/bQU+7iZeu64rfWMC6zzOxuq6jz9nr+EV3hnyTmWNp2haDucdRkMj2jea40XHWZe2jtFtRldrnrwuKYtlu9N55qq4ZtPJkKh70hunaPQ2HN/ApKWT6B7andlXzMbN6NZs37cQQoj6dCiziCe+3Upicg5XxIUwdVznau/ync2+nH3sz9nPqJhRANyx+A5CPUMZFT2KfhH9qjWhrA1N09DQMCgDs7fOZtaWWfi7+TMiegSjY0YTHxR/Xuf8Q5lFtA70QClF4uFsYsN98PqLtfx4afFWvkq7h+f6PcGNsVJz1pTklOYwZ+sc5u2dx4DIAbw99O2zzpt4OJvbP1pPuK+V+Q/2x9ddmm6KmkmyJxq9gvICZm6ayaM9HsXL4kW53cmEd9dw94BoRneNcHV4QgjRpDicGh+vPsT0JXtpH+rN/x7uX+uHZzanjWnrprEkeQl5ZXn4uvkyrNUwJnSYQGxA7HmvJzk/mYVJC/kp6See6v0Ug1oOIrUwlf05++kX2e+8h4SwO5y8+1sSby7bx7/HxHNjn6ha/T3NyY9bU3l58S6+mdSPlgEerg5HnIcyRxlf7P6C97e9T7G9mOvaXccD3R4gyD2oxvk3Judw+4frCPWx8vWkS877gY34a5IOWkSjlZyfTIhHCN4Wb5675LnK6V9vOMKWo7l4W+UQFUKI2jIaFPdcFsPlsSEUlNpRSlFqc1BQaifY2+281mE2mHn+0ud5us/TrElbU5mwdQ7qTGxALLmluaQXp9Pevz2LDi1i5qaZHC86TphnGA91e4hiezE/Jf3EtoxtKBR9wvvgYdYTkwivCCK8zv9B3qHMIh6ft4VNR3IZ1Tmc4Z3CLmi/NBdXdwmXB6FNzBe7v2DGxhkMbDGQv/f8O2382px13i1Hc7nzo/UEe7vx5b2S6ImLIzV7dWhh0sIqF7vJPSZXNoUR1R0rOMbti2+ne0h3Xh/8euX0ojI7g6b/QptgL76edIk05RRCiDowbfEevtlwhH+PjefqLheWKBTbijEoA1aTlS92f8G09dMIcQ8huzQbu2avnM9qtOJmdCPUM5SrY67mquirCPO8sATt+83HeHb+DsxGxb/HxnNN1wi5LgDbM7bz4roXmTpg6p8mDsJ1NqZvxKk56R3Wm2JbMdszt9fY+cqZlu9O5+XFe5h7dx/Cfd0bIFLR1EnNXgNYmLSQKX9ModRRCkBaURpT/pgCIAlfDTJLMpmUMIkyRxkPdH2gStlHvx8is7Cc926PlQu6EELUket6RrImKYuHv9zMou1p/HtMPIFe51fLd9LJmjmAkdEjMRvMTFs/rUqiB1DqKMXXzZfvrvnuouMO8nKjT3QAr1zbhTBfqeE46cs1J9iVs4utGVsl2WtkkvOTmbFxBsuPLKdvWF96h/XGw+xxzkSvsMyOl5uJoXGhDGofjMkoHdOJiydHUR2ZuWlmZaJ3UqmjlJmbZrooosaroLyA+xPuJ7Mkk1lXzKKtf9vKsvxSG+/+lsTwTqH0iDp7d9tCCCFqp22IN9/dfylPjYhl2a4TDJvxG7/vz7zg9flb/ZnQYQJ2p73G8hPFJy5ovZqmsWBzSuXYgZe1C+aTib0l0TuDrTQQHO5sy9jm6lBEhZzSHKatn8bYBWNZk7qGR7o/8qcdsJxud1o+g6f/wqLtaQCS6Ik6IzV7deR40fFaTf8re+GPFziYd5B3hrxD1+CuVcp8rGbeu70nYdI+XQgh6pzJaOCBwW0YGhfCs/O3E+pTu5q9moR5hpFWlFbj9NrKLirnuQXbWbT9OH1aB3DPgGhMRoO08qhBxwhfFm5tyab0ra4ORVT47dhvfLXnK65tdy0PdnvwrJ2vnGnv8QJu+WAdFqOBThE+9Ryl+KuRZK+OnO1i92eDwf5VPdL9EUZFj6J/ZP8q008OtdCvzfmdHIUQQlyY9qHefHv/pZVJ1JT/7eSSmEBGxNc+QZvcY3KV1xhAf2dvco/JtVrPij3pPPXddnKLy3lyRAfuG9gGo4wrdlZx4T441kZxOH85RbYiPM2erg7pL0fTNJYcXoLNaWN0m9FcHXM1nYM7E+Mbc97rOHCigFs+WIvJoPhq0iW0CpT/o6hbUkdcRyb3mIzVWLU2SqHILs1m6rqpZ23m8lfh1JwkJCegafoAokNbDa02z7Pf72Da4j0uiE4IIf56TiZ6hWV2NhzO5v7PN/K3rzaTU1Req/WMihnFlH5TCPcMR6EI9wxnSr8ptXpfPS2vhPvmbiTQ08IPDw3gwcFtJdE7h7hwbxxFMcR4XEpBeYGrw/nL2XxiM7cuupUnfnuCHw78gKZpGA3GWiV6WYVl3PT+OkBP9KKDJNETdU9q9urIyYva6b1xPtD1Afbl7COrJAujMro4QtfRNI3XE1/ns12f8c6QdxjUclC1efYeL+DrDUe4Z0C0CyIUQoi/Li83Ewse6s+sXw7y9or9/HEwi6nj4hlWi+ENRsWMuqDOyJIyCokJ9iLc151P7+pDz1b+uJn+utfL2vDzsHB560sY1nrsBfd0KmrvaMFRZmycQUJyAiHuIfyr37+4ps01F9TUOMDTwt0DohkaG0KbYK96iFYIGXqhQTg1JwZlICkviSWHl3BP53vOexDZ5uCD7R8wc9NMbo69maf7PF3jCfGeTxNZl5TFb09ejr+nxQVRCiGE2Jmaxz++3UZqbgm/PXk5vu71c60qtTl4felePvj9EB/d2ZvLO4TUy3b+KgrKC/C2eLs6jL+EDcc38NDyh7gr/i5u73h7lR5qz1dyVhElNgexYfJ+nqgbMvSCixmU3lo24XACs7bM4rejvzH1sqlE+zb/Wqz/7vsvMzfNZGT0SJ7q81SNiV7i4WyW7U7nieEdJNETQggX6hThyw8P9efAiUJ83c04nRobDmfTNyawzraxIyWPx77Zwv4Thdx6SRR9WgfU2br/iqate4XFhxfx64RfpSObOnDmmMkPdXuI3LJcCsoLeLj7w/QO603CdQn4uvle0PqPZhdz03trsVqMJDw2SJori3on7+w1oPu63sfrg17naOFRJvw4ga/2fEVTrlk9l/SidF5e9zIDIgfw4oAXK5PeM72+dB/B3m5M7N+6YQMUQghRjcVkoGNFj4DfbTrGDe+t5fF5W8krsV30uj9YlcTY/6wmv9TGp3f14cWxnfF0k+fOF+q3fRl89lsx2aXZpBSmuDqcJu/kmMlpRWloaKQVpfH86ud5LfE19mbvxak5AS440TuWU8xN76+lqNzBWzd2l0RPNAg5wzawYa2H0T2kO8//8TxT103FgIEbYm9wdVj1ItQzlHevfJeOgR3/tNnqS+PiOZZTgodFDkchhGhMxnSL5Eh2MbN+PcjqA5m8fG3ni2py6etuZlSXcP51TTy+Hn+d1xnqS4SfldLCSDxDYHvmdlp4t3B1SE1aTWMma2gEWAPOe7y8s0nLK+Hm99eRV2Ljy3suIT7ywhJGIWpLavZcINgjmNlDZzN1wFTGtB0DQG5proujqjs7MneQkJwAQK+wXudszx4T7MXA9sENEZoQQohasJgMPD6sA98/2A9vq4mJH2/gjaV7z3t5p1Pj49WHmLfhKADX9WzBzBu7S6JXR1oHemJyRGDEIoOr14GzjY2cU5pz0et+a/kBcorKmXt3Xzq3kERPNByXJHtKqclKqR1KqZ1KqUcrpgUopRKUUvsrvjfrAeqUUoxuMxqryUqxrZibFt7Ek789SV5ZnqtDuyhJeUk8sOwBZmycQbnjz7vvXrA5hXs/S6yTpkFCCCHqT5cWfvz0twE8OLgNl1aMhXqu1xBScku49cN1/PPHXazclwEg75TVMZPRQIdQP6zO1pLs1YGz9WpaF72dvjC6I98+cCndWvpd9LqEqI0GT/aUUvHAvUAfoCtwtVKqLfA0sFzTtHbA8orf/xIsRgtj244l4XAC4/83nj9S/3B1SBfkeNFx7ku4D4MyMOeKOViMZ+9spczu4LWle0nNLcFb3tcQQohGz81k5MkRsVzaRu+sZdrPe3hm/jYKSm0s2JxC/2kriH56If2nLefZ+dsYMeM3th7N5eXxnXnn5u4ujr75ig3zpiy7H7fE3eLqUJq8yT0mYzFUvXexGq1M7jH5gtaXUVDGY99sIa/YhtVslN43hUu4omYvDlinaVqxpml2YCUwHhgDfFoxz6fAWBfE5hImg4n7ut7H56M+x9PsyX0J9zF13dRz1ow1JjmlOUxKmERheSFzrphDlE/Un87/1bojHMsp4ckRsRjkBWUhhGhSNE3DqBTfbDjKZa/8wpP/3UZKbgkakJJbypfrjxLs7cbiyQO5qU+U1OjVo6s6h3FH19EMazXC1aE0eaNiRhHmGYbZYEahCPcMZ0q/KRc0hmRWYRm3fLCWn3ccJymzsB6iFeL8uKJKZQfwklIqECgBRgKJQKimaWkV8xwHQl0Qm0t1CuzEvKvn8eamN9mTvadJDcS+6NAiUgpSmHPlHOIC4/503sIyO2+vOMClMYEMbBfUQBEKIYSoK0opnhwRy9C4UG54dw12Z/UmnaV2B1GBtR+DTNTOkNhQLu8Qwv7c/SgU7fzbuTqkJqvYVkxqYSq3d7qdx3o+dsHryS4q55YP1nEku5iP7+xD96hm/WaSaOQaPNnTNG23UuoVYClQBGwBHGfMoymlanwZQCk1CZgEEBX157VHDW3B5hSmL9GbJkb4ufPE8A6M7R5Zq3VYTVae7vM0NocNo8FIZkkmCw4s4M5Od2IyNN7mjjfH3syAyAG08ml1znk/WX2IrKJynroqVp72CiFEE9azlT+OGhI9gLTc0hqni7qXV2LjvoQH6B3Wk1cHvurqcJqsrRlbsWt2eof1vuB15BaXc+sH6ziUWcSHd/SubPYshKu4pIMWTdM+1DStp6ZpA4EcYB+QrpQKB6j4fuIsy76naVovTdN6BQc3nh4cF2xO4Zn5209rxlLCM/O3s2DzhY17YzbqPZX9fOhnZm6aye2Lb+dw3uG6C7gOOJwOXlr7Enuz96KUOq9ED+CWvq147fqu8pKyEEI0AxF+7rWaLureVTNXocpaSSctF2nD8Q0YlZHuIRf+jmlhmZ1Su4P3bu/FAGm9JBoBV/XGGVLxPQr9fb0vgf8Bd1TMcgfwgytiu1DTl+ylxFalgpISm4PpS86/i+qa3NrxVl4b9BpHCo5w/Y/XN5qB2DVN46V1L/H13q9JTE+s1bL+nhau6yljAQkhRHPwxPAOuJurvnbgbjbyxPAOLororyc2zJuywhakFKaQWZLp6nCarE0nNtExsCOeZs9aL1tcbsfp1Gjh78HSRwcySIaUEo2Eq8bZ+04ptQv4EXhI07RcYBpwpVJqP3BFxe9NRmpuSa2m18bw1sOZf818eob1ZOq6qXy448OLXufFemfLO3y771vujr/7vHsAO5pdzPhZq9mdll/P0QkhhGgoY7tH8vL4zkT6uaOASD93Xh7fudavMYgLFxfuQ0am3tXB9oztLo6m6Zp9xWxeueyVWi9XUGrjlg/W8fwPOwB9SAwhGguXvASmadplNUzLAoa6IJw6EeHnTkoNiV1dNWMJ8Qhh9tDZzN8/n6FR+m4qthWfc8Dy+jB311ze2/Ye17a7tlbdEc9I2MfO1Hz8ZDBdIYRoVsZ2j5TkzoXiwn0oL47AXRnZnrmdy6Mud3VITZK7yZ2WPi1rtUxRmZ2JH29g27E87hvYpp4iE+LCyaOHOlJTMxaAG/vU7qTxZ5RSXNv+WvysfticNu5ecneDD8Tu1Jz8nvI7V0RdwfOXPH/eHazsOZ7P91tSuLNfa8J95T0OIYQQoq7EhXuDZuH21tO4o9Md515AVPP9/u+ZtWVWrV6VKS63M/GTDWw+mstbN3ZnRPzFD74uRF2TZK+OnNmMJczHip+7ic/WJJOWd/FNOc+kUAxqOahBB2LXNA2DMvD2kLd5ZeArGA3nPzTE9J/34uVm4oHB8tRLCCGEqEvRQV68PL4zE+IH4uvm6+pwmqQFBxaw6tiq836IrWkaD36xicTD2cy4oRujuoTXc4RCXBhJ9urQ2O6RrH56CIemjWLts0OZd38/hncKJdDTrc63ZTKYuL/r/Xw+8tRA7C+ve5lSe/10db0xfSN3L72b3NJcLEYLFqPl/JdNzmb5nhPcP6gNfh7nv5wQQgghzs1oUNzUJwqrtYj3t73P0YKjrg6pSSm1l7I9czu9wnqd9zJKKe7qH80bE7pxTdeIeoxOiIvTeAduawbah3rz4tjOAOQUleNuMWKtoannxegUdGog9rWpa+t03Sftzd7LI8sfIdA9ECfOWi/fOdKPqeM6M07e5xBCCCHqRWpuCUv3Heat3W8RYA2gpXfdvUbS3G3L2IbNaTuv8fVKbQ7WJmUxuEMIA6XHTdEESM1eAyi1Obh2zh/8fd4WnGcZfPZinByI/aurv8JqslJsK2burrnYnfaLXvfR/KPcl3AfHmYP3rvyPQKsAbVeh8Vk4Oa+Ubhb6jbRFUIIIYRuyc7jTJmfjrfZl+2Z0iNnbSSmJ2JQhnOOr1dmd/DA5xu565MNHMosaqDohLg4kuw1AKvZyM19oli0/TgvLtxdb9txN+kdnyw5vIRXN7x60QOxZxRncG/CvTg0B+9d+R7hXrVrj+5watz+0XoWbU+74BiEEEIIcW6xYT6AoqVnB7ZmbHV1OE1KuaOcXqG98LZ4n30eu5OHvtjEL3szeHFsZ6KDaj8WnxCuIMleA7l7QDQT+7fmo9WH+GBVUr1ua1y7cUwfOJ3k/GSu//F6vt7z9QUNxF7mKMPL7MWsobOI8Yup9fILNqfw274MnI1gEHghhBCiOYsL1xMVL9pwMPcgheWFLo6o6Xi056N8OPzsYxjbHE4e/nITy3af4N9jOnFz36gGjE6IiyPJXgNRSvHcqI5cFR/Giwt3s3Tn8Xrd3ojoEcy/Zj49Qnvw0rqXeHPTm+e9bLmjHE3TaOHdgnmj59E5uHOtt19md/BGwj7iI30YGS89VAkhhBD1yc/DQrivlfKiSMwGM4fzD7s6pCbhfB6GJ+xKZ+mudF4Y3ZHbLm1d/0EJUYekg5YGZDQoZtzQjSCv3fRo5V/v2wv1DGXOFXOYt3ce/SL7AXoi92c9adqcNh795VGC3IP4Z79/YlAX9jzgi7VHSMktYdq1nTEYzq8bYyGEEEJcuLhwH46lR7H2b2sxG82uDqdJmLNtDiuOrODLUV9iNtS8z0Z2DmfBQ/3p1tKvgaMT4uJJstfArGYj/x4bD+jNAk4UlBHpV3+DjCuluCH2BkB/evX4r4/jafHk2b7P4mPxqTKvU3Py/1b/P1alrKrVgOlnKiqz884vB+jXJpABbYMu+m8QQgghxLk9NyoOd4tREr1a2HB8AwpVmegt2JzC9CV7Sc0twcNi5P5BbXhkaDtJ9ESTJcmeCz313TbWJWUz/8F+hPpY6317Ts1Jx6COvLv1XRKPJ/LigBfJKsli5qaZHC86jofJgyJ7EY90f4QJHSZc8HY8LEZeu74LoT7WC04YhRBCCFE7McFeACw+tJgfDv7A7KGz5Tr8J8ocZWzL2MYNHfSH4gs2p/DM/O2U2BwAFJU7eGvFfloGeDBWho8STZS8s+dCd/WPJre4nDs/3kBBqa3et2c0GHmg6wN8MfILPMwe3Lv0Xv7v9/8jrSgNDY0iexFGZSTC8+IGB1VKMSQ2lE4RvnUUuRBCCCHOpdTm4L3fDrI9NZ3VKas5VnjM1SE1atsztlPmKKNXqD6Y+vQleysTvZNsDo3pS/a6Ijwh6oQkey4UH+nLrFt7si+9gAc+30S5vfYDll+IkwOxe5g8cGhVT2oOzcFbm9+64HW/8vMe3kjYd7EhCiGEEKKWTAbF60v3kZ4RAujJjDi7xPREFIoeoT0AfWD6mpxtuhBNgSR7LjaofTAvj+/M7wcy+eePOxtsu1aTlRJ7zSev40UX1lPo0exiPliVREZB2cWEJoQQQogLYDIa6BDmTVqmL+4md7ZlbnN1SI1aXEAcE+Mn4uumt0SKOEsfCmebLkRTIO/sNQITerWkoNRO3+iABt1umGcYaUXVBzwP8wy7oPW9kbAPg1JMHtruYkMTQgghxAWIC/MhYXc6XXt3YluGJHt/ZlDLQQxqOajy9yeGd+CZ+dsosZ1qaeVuNvLE8A6uCE+IOiE1e43E3QOiiY/UnyztSy9okG1O7jEZq7FqxzBWo5XJPSbXel270/JZsCWFif2jCfOt/85mhBBCCFFdbLg32UXldAu6hHDP8PMaR+6vKLMkk5TClCrTxnaP5OXxXYj0c0cBkX7uvDy+s3TOIpo0qdlrZOYlHuXp77bx/u29GBoXWq/bGhUzCqCyN84wzzAm95hcOb02pi/Zi7ebiQcGtanrMIUQQghxnuLCfTAaFJcGXs/kXg3bYqgp+W7fd/xny39YdeOqymac5XYna5OyePvm7vSIqv/xkIVoCJLsNTKjOoczd00yD3+5ma8mXVLv47qMihl1Qcndmf4xrANHsovw9ZCxfYQQQghX6dnKn13/Go6byQiA3WnHZJDbvTMlpifS3r99ZaIHsCstn683HGVg+2AXRiZE3ZJmnI2Mp5uJj+7sTZC3hbs/2cDhzCJXh3ReOkb4MCI+3NVhCCGEEH9pZqOhMtG7a8ldPLPqGRdH1PjYHDa2nNhCr7BeVaZvTM4B9IRZiOZCkr1GKNjbjU8n9sGpaUz8ZANldse5F3KRhF3pTP56M3nF9T9OoBBCCCHObd6Gozz13234u/lLJy012JG1g1JHKb1De1eZvulIDpF+7oT6SN8DovmQZK+Rign24oM7evP4sPaVT+gaG4dT49Wf97D9WB6ebo0zRiGEEOKvJjm7iO82HaNjYGdSi1LJLMl0dUiNSuLxRIDK8fVO2pScQw+p1RPNjDTibsT0ZgT6SWf7sTziwr0xGRtPfj5/0zH2nyhk1i09GlVcQgghxF9ZXLgPdqeGv6EtANsytjEkaoiLo2o8xrUbR3v/9vhbTyV2+aU2rGYjPaPqt68EIRqaS+7QlVKPKaV2KqV2KKW+UkpZlVLRSql1SqkDSqlvlFIWV8TWGCVlFDJ+9mqm/Liz0XShXGpzMCNhH11a+HJV/IWNyyeEEEKIuhcX7gNAWXE4JmWSppxnCHIPqjK+HoCP1cwv/xjMHf1auyYoIepJgyd7SqlI4G9AL03T4gEjcCPwCjBD07S2QA5wd0PH1ljFBHtx14BoPl97hNkrD7o6HAA+X5tMal4pT42IRSnl6nCEEEIIUaF1oCdWs4ED6WXc1/U+eob2dHVIjUZSbhJf7P6CvLK8GsvlnkY0N65qxmkC3JVSNsADSAOGADdXlH8KTAFmuyS6Ruip4bGk5Zby6s97CfOxMr5HC5fGc023CIwGRf+2QS6NQwghhBBVGQ2Kfm2CMBsN3N/1fleH06isOLqCmZtmMjJ6ZJXpd32ygbhwb54YHuuiyISoHw2e7GmalqKUeg04ApQAS4GNQK6mafaK2Y4BkQ0dW2NmMCimX9+FjIIynvzvNjpG+BAb5uOyeEK8rUzsH+2y7QshhBDi7D66U+9p0qk5OZx/mAC3APys8j5a4vFE2vq1rfK+XqnNwar9GbQP9XZhZELUD1c04/QHxgDRQATgCYyoxfKTlFKJSqnEjIyMeoqycXIzGZlzW0/+b1QcHVx0QsooKOO2D9ex53i+S7YvhBBCiPN3rOAYYxaMYdmRZa4OxeVsThubTmyiV2jV8fW2p+Rhc2gyvp5ollzRQcsVwCFN0zI0TbMB84H+gJ9S6mRNYwsgpaaFNU17T9O0Xpqm9QoODm6YiBsRX3czE/tHo5QiOauIlNySBt3+Oyv2s+ZgVqMdDkIIIYQQcOBEIVe8sZJDaVb83PzYnrnd1SG53K6sXZTYS+gddsb4ehWDqXeXnjhFM+SKZO8IcIlSykPpb8EOBXYBvwDXVcxzB/CDC2JrMuwOJ3d+vIE7P1rfYAOaH8kq5sv1R7ihd0uigzwbZJtCCCGEqL1gLzcOnChkV1oBnYM6S4+c6J2zGJWxWoc1G5NzaB3oQZCXm4siE6L+NHiyp2naOuC/wCZge0UM7wFPAX9XSh0AAoEPGzq2psRkNPDSuHgOZxUxaW4iZXZHvW/z9YS9GA2KyUPb1fu2hBBCCHHhfD3MRPha2XM8ny7BXTiYe5DC8kJXh+VS49qNY/VNqwl0D6wyvUsLX67r6dqO74SoLy4ZZ0/TtBc0TYvVNC1e07TbNE0r0zQtSdO0PpqmtdU07XpN08pcEVtT0q9NEK9d35V1h7L5x7fbcDrrbwy+Xan5/LAllbv6RxPiY6237QghhBCibsSF+7A7LZ8uQV3Q0NiRtcPVIbmcp7l6y6SHh7Tj4SHyIFs0Ty5J9kTdGdMtkqeviuXHral8uuZwvW0nJtiT/xsZx32D2tTbNoQQQghRd2LDvTmYUURsQDwzL59Jx8COrg7JZXZm7eSepfeQlJtUZXpucTnldqeLohKi/rlqnD1Rh+4bGIOvu5kx3SLqbRtWs5F7B8bU2/qFEEIIUbcujQkiPb8MnFaGRA1xdTgutS5tHevS1uHjVnXYqteX7mPh9jQS/+8KDAYZUF00P1Kz1wwopbipTxQeFhOFZXbWJmXV2bo1TeORrzazZOfxOlunEEIIIerfgHb66x4BnhaS8pKYu2supG5RnAAAIABJREFUmlZ/r3w0ZhuObyDaN5og96Aq0zcdySEu3FsSPdFsSbLXzLy0cBe3f7SexMPZdbK+JTvT+XFrKjlF5XWyPiGEEEI0HE3TyC+1sTF9I69ueJVjBcdcHVKDszvtbD6xmd6hVYdcKCqzszstn55RMr6eaL4k2WtmnhgeS6SfO/d8lsiBExfX65bd4fz/7N15fJXlnf//1ycnO0lYkkACkV0gLCFABLHVilqtUgerVqt2xm3GWuvWzji17Xw7OnaztlW7Wn/tqG2tS62o1XGrrUurVZKALIZNDQgkIUAWspHt+v1x7kBCzgkn4SwkeT8fjzxyznXdyyd37nOf8znXdV8XP3hpE9OyR2iUKhERkUHo0v/vba79bQkFWQUArN0z/KZg2LhvI41tjb3m13t3Ry2dDhZoMnUZwpTsDTFjRiTy0JWLiY8zrnjgHXbvbxnwtp4s3cnW3Q3cctZM4n06VURERAabiWNSKauoZ+rIqaTEpwzL+fbaO9tZkruk1/x6q7fXArDwOCV7MnTpE/wQNDEzlf+94gT2NrRy6x/XDWgbLW0d3P3nzcw/bhRnzckJc4QiIiISDfm56dQ0tbGvsYO5WXOHZbJXOLaQX535K7JTs3uUnzZrLHecN5eRqQkxikwk8jQa5xBVkDeKX11exKTM1AGtn+iL47+WzyZnZBJmumlZRERkMMrP9Y8+WVZRz7yseTyy8RHaOttIiBseCU5HZwfN7c2kJab1qsvPzTh4fESGKrXsDWEfm55F3uhUOjsdz67d1a8RuOLijOUFuSyaNCaCEYqIiEgkzcrpSvb2c9Xcq3j94teHTaIHsLFmIx979GO8vuP1HuW797fwSlkVjQfaYxSZSHQo2RsG/m99Bdf/fjX3/HlLSMv//NWt/OyvW4ft8MwiIiJDxcjUBG45ayaLp4xhZNJIkuOTYx1SVBVXFtPpOpk1ZlaP8lc3VXP1Q8VU1DXHKDKR6FCyNwwsn5fLhYvyuPeVLTy2anufy+6ub+Enr2xlY+V+dd8UEREZAr60bDqLvBEnH1z/IL949xcxjih6iiuLmZQxibGpY3uUr95eQ0ZyPFOzenfvFBlKlOwNA2bGd8+fxykzsvn6yvX8ddPuoMv+5C9baevo5N8/OSOKEYqIiEikNLW2U7Kthtb2TtbvXc/KLStjHVJUdHR2UFJVQtG4ol51JdtqWDhptCZTlyFPyd4wkeCL4+eXLWRWTjpfeWwNDQH6qJfvaeSRd7bzucXHMTlrRAyiFBERkXD768ZqLvjFm2yu2k9BVgEVjRVUN1XHOqyI21yzmf1t+3vNr1fX3MaW3Q0s1GTqMgxoNM5hJC0pngeuOIHt+5pIS+r9r//hy5tJ8MVx42nHxyA6ERERiYRZuemAf0TOgomHJlc/feLpsQwr4rJTs7l18a0syV3So/zdj2pxjoNdW0WGMrXsDTNjM5IpmuwfYfP5dRXsa2w9WHfVxybzPyvmMDZjeN28LSIiMpRNzhxBckIcZRX7yc/MJz4ufljMt5eVksVl+ZeRlZLVo/zj07N48eZTlOzJsKCWvWGqqr6Fmx9bQ05GEm0djoq6FsaPSuGWs2bGOjQREREJI1+cMXNcOhsr60nyJbEkdwnG0L5XrdN18lL5SyzOXcyY5J7TSMXFGTNz0mMUmUh0qWVvmBqXkcyli49j275mdtW14ICdtc187cl1PLV6Z6zDExERkTDKz82grKIe5xz3nXEfNy+6OdYhRdTmms3c8vot/H3n33uUd3Q6/vvp9ZRsq4lRZCLRpWRvGHvpvd6jcja3dXDXi5tiEI2IiIhEyuUnTeaX/9xzVMqhPJ/uqspVAL0GZ9myez8PvbWNbXsbYxGWSNQp2RvGdtUGnkg0WLmIiIgMTvm5GSyeMgYzo7allhVPreCPW/4Y67AipriymLy0PHJG5PQoL91WC6CROGXYULI3jI0fldKvchERERmcnHO8sL6Cdz7cx8ikkdS01PBu9buxDisiOl0nJbtLKMoJPL9e5ohEJmWmxiAykehTsjeM3XLWTFISfD3KUhJ8GqRFRERkiDEz7ni2jN/9YxtmxrzseUN2RM73a9+n7kBdry6cAKu317Bg4mjMhvYANSJdNBrnMHbeggkA3PXiJnbVNh8cjbOrXERERIaO/Nx0yirqASjIKuD1Ha9T31pPRmJGjCMLr+NHH88LF7zQ6+9qaeugrbNTUy7IsBL1ZM/MZgKPdSuaCnwT+I1XPhkoBy5yzmmopAg7b8EEJXciIiLDwKycDP66qZqWtg7mZc8DYH31ek6acFKMIwu/CWm9P9skJ/h44z9Po6Nz6A5MI3K4qHfjdM5tcs4VOucKgUVAE7ASuBV4xTl3PPCK91xEREREwiA/N4OOTsfW3Q3My5rHuVPPZWTSyFiHFVadrpNv/v2bB0fjDMQXpy6cMnzE+p6904H3nXPbgBXAQ175Q8B5MYtKREREZIiZleufSLysop70xHS+c/J3mJM1J8ZRhdfW2q2s3LqSXQ27etXd8Mhqvv/CxhhEJRI7sU72Pgc84j0e55yr8B5XAuNiE5KIiIjI0DM5cwSv3XIqFyzMA/wjdH5U/9GQmm+vuLIYoNdInO0dnfz5vSqaWjtiEZZIzMQs2TOzROCfgD8cXuf8V52AVx4zu8bMis2suLq6OsJRioiIiAwNvjhjUuYI4rxujE9tfYpzVp7DR/s/inFk4VNcVcz4EeN73bO3sXI/zW0dLNTgLDLMxLJl72yg1DlX5T2vMrNcAO/37kArOefud84VOeeKsrOzoxSqiIiIyOD35tY9/PfT63HOMTtzNgBr9wyNKRiccxRXFgedXw/QSJwy7MQy2buEQ104AZ4BLvceXw48HfWIRERERIawzVX7eeitbezef4Dpo6aTEp8yZObb29eyj6zULBbnLO5VV7KthnEZSYwfmRyDyERiJybz7JnZCOCTwBe6FX8PeNzMrga2ARfFIjYRERGRoSo/1z/33HsV9SybOZZ5WUNncvXMlEye/KcnA96DOGNcGnmjUzSZugw7MUn2nHONQOZhZXvxj84pIiIiIhEwy0v2NlbsP5jsPbThIVraW0iOH9ytXs45zCxgQnf9acfHICKR2AupG6f5fd7Mvuk9n2hmvdvIRUREROSYNTIlgQmjUiirqAfgnKnncOcpdw76Fi/nHJ9e+WkeXP9gr7r9LW20d3RGPyiRY0Co9+z9HFiK/z47gP3AzyISkYiIiIhEzOzxGdS3tAEwY/QMzpx8Jkm+pBhHdXQ+qPuA7fu3k5GU0avuJ3/ZStG3/0xH59CZYkIkVKF241zinFtoZqsBnHM13tQJIiIiIjKI3Pf5RfjiDrXkbdy3kd1Nuzkl75QYRnV0uubXO2HcCb3qSrbVMC07rcffLDJchNqy12ZmPry578wsG1B7uIiIiMggc3jS8+t1v+aOf9wRo2jCY1XVKsaljiMvPa9H+YH2DtbtqNOUCzJshZrs/RhYCYw1s28DfwO+E7GoRERERCQi6prauOKBd3h+XQUABdkFVDZWsrsp4BTHxzznHKsqV1GUU9Tr3sMNu+pp7ehk4cRRMYpOJLZCSvaccw8D/wl8F6gAznPO/SGSgYmIiIhI+KUlx/P2B/tYVe6faLwguwCAddXrYhnWgLV2tnLB8Rdw9uSze9WVepOpL5yolj0ZnkK6Z8/MxgC76TYJupklOOfaIhWYiIiIiISfL86YkZN+cETO/DH5JMQl8O6edzl90uCbBSvJl8SNC28MWLd0Wib/tTyfsRmDe1oJkYEKtRtnKVANbAa2eI/LzazUzBZFKjgRERERCb/ZuemUVdbjnCPRl8isMbNYv2d9rMMakK01W2lubw5YN2f8SP715KlRjkjk2BFqsvcycI5zLss5lwmcDTwLXId/WgYRERERGSRm5WRQ29RGVf0BAO48+U5+etpPYxxV/znn+LeX/43b37q9V11NYyuvb66mqbU9BpGJHBtCTfZOdM692PXEOfcSsNQ59w9gcE/MIiIiIjLMFOSNZPGUMez35ts7LuM4UhNSYxxV/5XXl7OneQ+LxvXuaPa3rXv4l/99hw+qG2MQmcixIdRkr8LMvmpmk7yf/wSqvOkYNAWDiIiIyCCyYOJoHv/CUo4flw5Aa0crPy79Ma/veD3GkfVPcVXf8+ulJPiYlZMe7bBEjhmhJnuXAnnAU97PRK/MB1wUmdBEREREJJKccwAkxCXwxy1/5KXyl2IcUf+sqlxFdko2kzIm9aor3V7D/ONGEu8L9eOuyNAT0miczrk9wA1BqreGLxwRERERiYbbntnAqvJ9PHfjyZgZBVkFrN2zNtZhhcw5R0llScD59ZpbO3hvVz3XnKLBWWR4C3XqhWz88+zNAQ6OXeucOy1CcYmIiIhIBKUnx7Oxcj8tbR0kJ/goyC7g1R2vUnegjpFJI2MdXkjuWXYPCb6EXuVrd9TS3uk0v54Me6G2az8MbASmALcD5cCqCMUkIiIiIhGWn5tBR6dj6+4GAOZlzwMYNFMwmBnzsucxa8ysXnWLJo3m2Rs+zonTMmMQmcixI9RkL9M592ugzTn3mnPuKkCteiIiIiKDVNfAJe95k6vPzZxLemI6e1v2xjKskD3z/jP8feffA9bF++KYO2EkaUkhdWITGbJCfQW0eb8rzGw5sAsYE5mQRERERCTSJmWOICXBR5mX7KUlpvG3z/2NODv2BzRxznFv6b0sHLuQj034WK+67z2/kTPn5LBokrpxyvAWarL3LTMbCfw78BMgA7g5YlGJiIiISET54oyrPz6F48elHSwbDIkewEf7P2J3025OyOk95cL2fU388vUPmJQ5QsmeDHuhvqJrnHN1zrn1zrllzrlFwL5IBiYiIiIikfUfZ81kReGEg89Lq0q54JkL2Fa/LYZRHVnX/HpF44p61ZVsqwFg4aRRUY1J5FgUarL3kxDLRERERGQQ2b2/hebWDsDflXNzzWbWVh/bUzCsqlzFmOQxTBk5pVddybYa0pPiOX6sJlMX6TPZM7OlZvbvQLaZfaXbz234J1QXERERkUGquHwfi7/9Cv/4wD8oy7SR00iNTz3mk70P6z7khJwTes2vB1C6vZbCiaPwxfWuExlujnTPXiKQ5i3X/euReuDCSAUlIiIiIpF3/LhDI3IumzUWX5yPeVnzjvnJ1R9Z/ghN7U29ylvbO6lvbuPM2eNiEJXIsafPZM859xrwmpk96JwLW+dtMxsF/AqYCzjgKmAT8BgwGf88fhc552rCtU8RERER6WlkSgITRqWwsXL/wbJ52fN4cP2DNLc3kxKfEsPogjMzRiSM6FWeGB/H3289jbaOzhhEJXLsCXU0ziQzux9/InZwHefcQOfauxd4wTl3oZklAqnA14FXnHPfM7NbgVuBrw5w+yIiIiISgvzcjIPTLwCcmHsiOxt20tDacEwme3eX3E17Zzu3nHBL0GUSfINjVFGRSAs12fsDcB/+1riOo9mhN4XDKcAVAM65VqDVzFYAp3qLPQS8ipI9ERERkYianZvOXzZW0dLWQXKCjyW5S1iSuyTWYQX1wocvMCdrTsC6W/+4ltEjEvnqp2ZFOSqRY1OoyV67c+4XYdrnFKAaeMDM5gMlwE3AOOdchbdMJaDO1iIiIiIR9qm5uUzMHIFzh8qcc9S31jMyaWTsAgtgZ8NOdjXu4vI5l/eq6+x0PL++knPm5cQgMpFjU6ht3H8ys+vMLNfMxnT9DHCf8cBC4BfOuQVAI/4umwc55xz+e/l6MbNrzKzYzIqrq6sHGIKIiIiIAMwen8GFi/JISTw00Pod/7iDC565IIZRBbaqchVAwMnUP9jTQF1zGwsmaiJ1kS6hJnuXA7cAb+JviSsBige4zx3ADufc297zJ/Anf1Vmlgvg/d4daGXn3P3OuSLnXFF2dvYAQxARERGRLu/tqmf19kPj4k0dOZWqpiqqGqtiGFVvxZXFjEoaxbRR03rVdU2mvmiSkj2RLiEle865KQF+pg5kh865SuAjM5vpFZ0OvAc8gz+pxPv99EC2LyIiIiL98/WV67jzhY0HnxdkFwCwbs+6WIUUUM6IHD499dPEWe+PsKXbahmVmsDUrN6jdIoMVyHds2dmqcBXgInOuWvM7HhgpnPu2QHu9wbgYW8kzg+AK/Enno+b2dXANuCiAW5bRERERPohPzeD/1tXgXMOM2PWmFkkxCWwtnotZ0w6I9bhHXT9guuD1h03JoXzCicEnGhdZLgKdYCWB/B33TzJe74T/widA0r2nHNrgKIAVacPZHsiIiIiMnD5uek88s52KutbyB2ZQqIvkfwx+cfU5OoNrQ2kJqQGbNUDuP6046MckcixL9R79qY5574PtAE455oAfW0iIiIiMgTk52YA9Jhv78q5V3JZ/mWxCqmXO1fdyYqnVuBc7zH8mlrb6egMOLafyLAWarLXamYpeCNkmtk04EDEohIRERGRqJmZkw5AWcX+g2VnTDqDT076ZKxC6mVV5SqmjZoWsJvmL159n4V3vMyB9qOaDlpkyAm1G+d/Ay8Ax5nZw8DH8CZFFxEREZHBLSM5gUevOZGZ49IPljnnKNtXRmJcItNHT49hdFDRUMHOhp18Pv/zAetLt9eQNzqFpHhfwHqR4SrU0ThfBs7Hn+A9AhQ5516NXFgiIiIiEk0nTs1k9IjEHmXX/fk6HtjwQIwiOqS4yj/jV6D59To6HWu217JQ8+uJ9BJSsmdmnwHanXPPeSNwtpvZeZENTURERESiZevuBn721620tPm7QpoZ87LnsbY69oO0rKpcRUZiBseP7j0Iy6bK/TS2dmh+PZEAQr1n77+dc3VdT5xztfi7doqIiIjIELC5aj93vbiJLVUNB8vmZ8+nvL6cugN1fawZeedOO5f/KPqPgCNxlniTwatlT6S3UJO9QMuFer+fiIiIiBzjAo3IOS9rHhD7ydVPyDmBzxz/mYB1CyeO4t8/OYPjxqREOSqRY1+oyV6xmf3IzKZ5Pz/CP++eiIiIiAwBk8akkpLgo6zyULI3N2suhrGuOnbJ3uaazZRWldLpOgPWzxk/khtOP16TqYsEEGqydwPQCjwGPAq0AF+KVFAiIiIiEl1xccbMnPQeLXsjEkbw0NkP8fnZgUfBjIbfl/2e6/9yfcD59epb2njz/T00t2rKBZFAjtgV08x8wLPOuWVRiEdEREREYiQ/N4NXyqp6lC0YuyBG0fitqlzForGL8MX1nlbhH+/v5ZrflvCHa5dywuQxMYhO5Nh2xJY951wH0GlmI6MQj4iIiIjEyNfOmcWbt57Wo6yysZJfrPkFuxp2RT2eqsYqtu/fTlFOUcD60u21JPiMeRP0MVUkkFAHWWkA1pnZy0BjV6Fz7saIRCUiIiIiUZeRnNCrrKG1gZ+/+3PGp41nxfQVUY2nr/n1AEq31TB7/EiSEzSZukggod6z9yTw/4DX8Q/M0vUjIiIiIkNEZ6fjv59ez1Ordx4smzpqKmkJaTEZkbOkqoT0hHRmjp7Zq66to5O1O2tZpCkXRIIKqWXPOfeQmaUAE51zmyIck4iIiIjEQFyc8crG3extbOW8BRP8ZRbHnKw5MZlc/dbFt3LprEsD3q9XVlFPS1snCyeNinpcIoNFSC17ZnYusAZ4wXteaGbPRDIwEREREYm+WTkZPUbkBCjIKmBzzWaa25ujGkuiL5Hpo6cHrJuVk8FTX/oYJ0/PjmpMIoNJqN04bwMWA7UAzrk1wNQIxSQiIiIiMTI7N50P9zTS0nZoOoP52fNJ9CWyvX571OJ4a9db/Kj4RzS2NQasT4yPo/C4UYxM7X2foYj4hZrstTnn6g4rCzyzpYiIiIgMWvm5GXQ62Fy1/2DZSRNO4s1L3mTmmN73zkXKy9te5g+b/0CSLylg/d0vb6Z0e03U4hEZjEJN9jaY2aWAz8yON7OfAG9GMC4RERERiYH83AzGj0ymtqntYFlCXALxcaEO4h4exVXFLBi7IOB+K+tauPeVLazeXhvVmEQGm1CTvRuAOcAB4PdAHXBzpIISERERkdiYnDWCN792OqfM6Hkv3NNbn+a6P18XlRj2NO/hw7oPg0+54LXoLZqkkThF+tLnVzRmlgxcC0wH1gFLnXPt0QhMRERERI4dDW0NvLHzDSobK8kZkRPRfRVX9j2/Xsm2GpLi45idmxHROEQGuyO17D0EFOFP9M4GfhDxiEREREQkpn73j20s//EbOOcOlhVkFQBEZb69+tZ6JqRNYNaYWQHrS7fXUJA3ksT4UDupiQxPR3qFzHbOfd4590vgQuCUKMQkIiIiIjHknGPDrnoq6loOls0aM4vEuMSozLd30cyLeP785wPer9fR6aiqa2GhJlMXOaIj3Wl78M5c51y7mYVlp2ZWDuwHOoB251yRmY0BHgMmA+XARc45DbEkIiIiEmX5XvfIsop6xo9KASDBl8CszFkRT/acc5gZwT53+uKMv996GgfaNTC8yJEcqWVvvpnVez/7gYKux2ZWf4R1j2SZc67QOVfkPb8VeMU5dzzwivdcRERERKJsZk46ABsr9/co/0TeJ5iQNiGi+35528ucu/JcdjbsDLqMmZGc4ItoHCJDQZ8te865aL6KVgCneo8fAl4FvhrF/YuIiIgIkJ6cwHFjUnivoud3+9cUXBPxfa+qXMXupt2MTR0bsP62ZzaQnODj1rMD388nIofE6q5WB7xkZiVm1nXVGOecq/AeVwLjYhOaiIiIiCyfN54ZY9MD1rV1tAUsD4eu+fUS4hJ61TnneG5dBZV1zRHbv8hQEt3ZMQ/5uHNup5mNBV42s43dK51zzsxcoBW95PAagIkTJ0Y+UhEREZFhKFjL2WXPXcakjEl85+TvhH2f+1r2sbV2K8unLg9Yv6Ommer9BzS/nkiIYtKy55zb6f3eDawEFgNVZpYL4P3eHWTd+51zRc65ouzs7ECLiIiIiEgYdHQ6Wg8bCCUzJTNi0y+UVJUAUDSuKGB912TqCzQSp0hIop7smdkIM0vvegycCawHngEu9xa7HHg62rGJiIiIiF9FXTNz//tFVq7e0aO8ILuA8vpyaltqw77P7JRsPjP9M8zJmhOwvnRbDamJPmblBO5eKiI9xaIb5zhgpTecbjzwe+fcC2a2CnjczK4GtgEXxSA2EREREQHGpSdjBmUVPUfknJ89H/BPrn5y3slh3Wfh2EIKxxYGrR+bkcynC3KJ92kydZFQRD3Zc859AMwPUL4XOD3a8YiIiIhIb3FxxsycdMoOG5FzTuYc4iwu7MleU1sTu5t2MyljUtA59r60bHrY9icyHOhrEREREREJKD83g42V+3Hu0Lh5qQmpXDv/WhaMXRDWfb25603Ofepc1u4JPGl7S1sHnZ0Bx+8TkSCU7ImIiIhIQPm5GdQ1t1FR19Kj/Ivzv8jS8UvDuq/iqmJS4lOYPWZ2wPpf/+1DFn7rZZpa28O6X5GhTMmeiIiIiAS0dOoYbj7jeOJ9PbtVdnR2sLlmc1gHaVlVuYr52fNJ8PWeXw/8g7NkjkgkNTFWM4eJDD5K9kREREQkoOlj07n5jBmMTU/uUV5eX84Fz1zAqzteDct+altq2VyzmRNyTghY75yjdHsNCzXlgki/KNkTERERkaDqmtrYurvniJxTRk4hLSGNddXhmW+vZHff8+t9uKeRmqY2TaYu0k9K9kREREQkqFueeJcv/LakR1mcxTEva17QwVT6q2hcEXefejdzs+YGrC/d7u8uulDJnki/KNkTERERkaDyczP4cE8jLW0dPcoLsgvYXLOZpramo97HyKSRnDHpDBJ9iUFiSOdLy6YxPTvtqPclMpwo2RMRERGRoPJz0+l0sKmyZ1fOguwCOl0n7+1976i2X3egjgfXP0hlY2XQZeaMH8ktZ80iLi7w/HsiEpiSPREREREJKj83A4CNlT0nV18wdgE/O/1nzBoz66i2X1JVwg9LfsiO/TsC1je1trOqfF+vlkUROTIleyIiIiIS1HGjUxmR6KOsomfLXnpiOqfknUJa4tF1rSyuKibJl8S87HkB60u21fDZ+95iVfm+o9qPyHCkZE9EREREgoqLM354USGXLpnYq25LzRZ+s+E3OOcGvP3iymLmZ88nyZcUsL5kWw1mUHjcqAHvQ2S4UrInIiIiIn361NwcZoxL71X+TuU73FV8F1VNVQPabt2BOjbu2xh0ygXwj8Q5c1w66cmBJ1sXkeCU7ImIiIhIn/Y1tvL0mp3sa2ztUT4/ez4A71a/O6DtbqnZgs98FOUETvY6Ox2rt9doygWRAVKyJyIiIiJ9+qC6gZseXcPq7TU9ymeOnkliXCJrqwc2315RThF/v+TvFI4tDFi/tbqB/S3tLJyoZE9kIJTsiYiIiEifZub4u3CWVfQckTPBl0B+Zj7r9qwb8LZTE1JJiAvcRXNSZipPXLuUZTOzB7x9keFMyZ6IiIiI9Ck9OYHjxqRQdthce+Cfb29r7VY6Ovs3NUJ9az2XP385b1e8HXSZpHgfRZPHkJkWePAWEembkj0REREROaL8nIxeLXsA186/ltcueg1fnK9f21tdtZrS3aXEWfCPo/e99j6lh3UdFZHQKdkTERERkSOalZtB+Z5Gmlt7tuBlJGaQ4Ov/SJnFVcUkxCUwLyvw/Hq1Ta187/mNvPX+3gHFKyIQH+sAREREROTY9/kTJ/K5E44jOaF3W8Ev3/0lAF+Y/4WQt7eqchUF2QUkxycHrF+9vRaARRqJU2TA1LInIiIiIkc0Nj2Z8aNSMLNede/tfY8/ffCnkLfV0NpA2b4yTsg5IegyJdtq8MUZBXkjBxSviCjZExEREZEQ/fatclau3tGrvCC7gG3126htqQ1pO7UHajlp/EmcmHti0GVKt9cwOzeD1ER1RBMZKCV7IiIiIhKSlat38sg7H/UqL8guAGDtntDm28tLz+MXZ/yCReMWBay9gJX3AAAgAElEQVR3zrFtbxMLJ44aeLAiErtkz8x8ZrbazJ71nk8xs7fNbKuZPWZmibGKTURERER6y8/NYGNFPc65HuVzMucQZ3Ehz7fX0NrQZ72Z8cZ/LuOrZ88acKwiEtuWvZuAsm7P7wTuds5NB2qAq2MSlYiIiIgENCs3g/qWdnbVtfQoT01IZUnOEoze9/MdrqG1gZMfPZmHyx7uc7m4OFMXTpGjFJNkz8zygOXAr7znBpwGPOEt8hBwXixiExEREZHAZuemA7AxwHx79595P9cVXnfEbazevZp21860UdOCLvP9Fzby3efLgtaLSGhi1bJ3D/CfQKf3PBOodc61e893ABNiEZiIiIiIBDYzJ4MEn1FxWMted4d38TxccVUx8XHxzM+eH3SZZ9dWsG1P04DjFBG/qCd7ZvZpYLdzrmSA619jZsVmVlxdXR3m6EREREQkmLSkeDbc/ik+f+KkXnV7mvew/MnlPP3+031uo7iymHlZ80iJTwlYX73/ANv3NWl+PZEwiEXL3seAfzKzcuBR/N037wVGmVlXx+w8YGeglZ1z9zvnipxzRdnZ2dGIV0REREQ8ifGBPz6OSR5DTUsNa6uDj8jZ1NbEhr0bKBpXFHSZ0u01ACycpJE4RY5W1JM959zXnHN5zrnJwOeAvzjnLgP+ClzoLXY50PfXQiIiIiISda9vrubzv3qb5taOHuVxFse87Hl9JnsAX1/ydc6afFbQ+tJtNST64pgzXpOpixytY2meva8CXzGzrfjv4ft1jOMRERERkcM0tXbwt6172Fy1v1ddQXYBW2q30NQW+H671IRULpp5ETPHzAy6/YyUBM6cM47kBF/YYhYZrmI6nq1z7lXgVe/xB8DiWMYjIiIiIn2bnZsBQFlFPfOP69nVcl7WPDpdJxv2buCEnBN6rfvaR68xc8xMckbkBN3+l5ZND2/AIsPYsdSyJyIiIiLHuLzRKYxI9FEWYPqFgqwCzj/+fDISM3rVNbU1cfNfb+axTY8F3XZbR+cRR/MUkdAp2RMRERGRkMXFGbNyMyir7N2Nc1TyKG4/6faA3TTXVK+h3bX3OTjLb97axgnf/jN1TW1hjVlkuFKyJyIiIiL9cuLUMWSlJQas63SdlNeV92qhK64sxmc+FoxdEHS7pdtrSIr3MTI1IazxigxXSvZEREREpF9uOWsWP79sUcC6JzY/wblPnUtlY2WP8lWVq5iTOYfUhNSg2y3dVsNCza8nEjZK9kREREQkbOZkzQHg3T3vHixraW9h/d71FOUE78JZUddMRV0LCydqfj2RcFGyJyIiIiL90treyZl3v8bPX93aq27G6Bkk+ZJ6zLeXHJ/Mixe8yGX5lwXdZum2WgAWqWVPJGxiOvWCiIiIiAw+ifFxtLR1smFn7xE5E+ISmJ05u9fk6mNTx/a5zclZqfzbyVPIz+09kqeIDIxa9kRERESk3/Jz0wNOvwD+KRjK9pbR1uEfVfPHpT/mpfKX+tzenPEj+cby2ST49PFUJFz0ahIRERGRfpuVk8GHextpbu3oVXfutHO56xN3AdDc3swDGx5g/Z71Qbd1oL2D1dtraG3vjFi8IsORkj0RERER6bf83Aycg01VvefbmzlmJqdNPI0EXwJrq9fS3tne5+Asa3fU8Zmfv8mrm3ZHMmSRYUf37ImIiIhIv83LG8kFC/NITgjcdrB+z3r2texjbfVa4iyOhWMXBt1W6bYaAE27IBJmSvZEREREpN8mjErhhxfND1r/q3W/YkvNFrJSssgfk09aYlrQZUu21TA5M5WstKRIhCoybKkbp4iIiIgMiHOOPQ0HAtYVZBewff929rXsY0nukj63Ubq9hoUT1aonEm5K9kRERERkQP7n2fdY9oNXcc71qmtsbQSgvL6c5z98nuc+eC7gNj7a18yehlZ14RSJAHXjFBEREZEBmZadxv6WdnbWNpM3OvVg+XMfPMdv3vvNwecVjRXc9uZtACyfurzHNsZmJPH7f1vC9Ozg3TxFZGDUsiciIiIiA9I1AXpZRc8ROe8tvZeWjpYeZS0dLdxbem+vbSQn+DhpWhZjM5IjF6jIMDXkWvba2trYsWMHLS0tR15Y+iU5OZm8vDwSEhJiHYqIiIgcA2bmpAOwsaKeT84ed7C8srEy4PKByh/8+4fMP24UC3TPnkjYDblkb8eOHaSnpzN58mTMLNbhDBnOOfbu3cuOHTuYMmVKrMMRERGRY0BaUjyTMlMpq6zvUZ4zIoeKxopey+eMyOnxvPFAO//z7Htcv2y6kj2RCBhy3ThbWlrIzMxUohdmZkZmZqZaTEVERKSHL58xg88WHdej7KaFN5Hs69ktM9mXzE0Lb+pR9u6OWjqd5tcTiZQh17IHKNGLEB1XEREROdx5Cyb0KusahOXe0nupbKwkZ0QONy28qdfgLF2TqS84TsmeSCQMuZa9Y8W3v/1t5syZQ0FBAYWFhbz99tth2/ZJJ50EQHl5Ob///e8PlhcXF3PjjTf2ue59993Hb37jHx3rwQcfZNeuXWGLS0RERIafA+0dlG6vYff+nr1/lk9dzksXvsTay9fy0oUv9Ur0wD+Z+vSxaYxM1XgAIpEwJFv2+uOp1Tu568VN7KptZvyoFG45a2bAb6j646233uLZZ5+ltLSUpKQk9uzZQ2tra5gihjfffBM4lOxdeumlABQVFVFUVNTnutdee+3Bxw8++CBz585l/PjxYYtNREREhpequgOc//M3+e7587hk8cSQ13POsWV3Ax+blhXB6ESGt6i37JlZspm9Y2bvmtkGM7vdK59iZm+b2VYze8zMEiMdy1Ord/K1J9exs7YZB+ysbeZrT67jqdU7j2q7FRUVZGVlkZSUBEBWVhbjx4+npKSET3ziEyxatIizzjqLigr/jcunnnoqX/3qV1m8eDEzZszgjTfeAGDDhg0sXryYwsJCCgoK2LJlCwBpaf55aG699VbeeOMNCgsLufvuu3n11Vf59Kc/TWdnJ5MnT6a2tvZgTMcffzxVVVXcdttt/OAHP+CJJ56guLiYyy67jMLCQp577jnOO++8g8u//PLLfOYznzmq4yAiIiJDX97oFNKS4imrqD/ywt2YGa/dsoxvfDo/QpGJSCy6cR4ATnPOzQcKgU+Z2YnAncDdzrnpQA1wdTh2dvEv3+r189u3ygH4/gsbaW7r6LF8c1sHt/1pAwD7Glt7rRuKM888k48++ogZM2Zw3XXX8dprr9HW1sYNN9zAE088QUlJCVdddRXf+MY3Dq7T3t7OO++8wz333MPtt98O+Ltc3nTTTaxZs4bi4mLy8vJ67Od73/seJ598MmvWrOHLX/7ywfK4uDhWrFjBypUrAXj77beZNGkS48YdGhL5wgsvpKioiIcffpg1a9ZwzjnnsHHjRqqrqwF44IEHuOqqq0L6e0VERGT4ioszZuaks/GwufZC4YszMpLVhVMkUqKe7Dm/Bu9pgvfjgNOAJ7zyh4DzAqweVhV1gUeWrG1qO6rtpqWlUVJSwv333092djYXX3wxv/zlL1m/fj2f/OQnKSws5Fvf+hY7duw4uM75558PwKJFiygvLwdg6dKlfOc73+HOO+9k27ZtpKSkhBzDxRdfzGOPPQbAo48+ysUXX9zn8mbGP//zP/O73/2O2tpa3nrrLc4+++x+/uUiIiIyHOXnplNWWY9zLuR1fvqXLXzv+Y0RjEpEYnLPnpn5gBJgOvAz4H2g1jnX7i2yAwh445yZXQNcAzBx4pH7hT/2haVB68aPSmFnbXOv8gmj/EnVmBGJfa7fF5/Px6mnnsqpp57KvHnz+NnPfsacOXN4663ArYNdXT59Ph/t7f7DcOmll7JkyRKee+45zjnnHH75y19y2mmnhbT/pUuXsnXrVqqrq3nqqaf4r//6ryOuc+WVV3LuueeSnJzMZz/7WeLjh/0tnSIiIhKC/NwMfveP7eysbSZvdGpI6zzz7i7Gjwr9i2wR6b+YjMbpnOtwzhUCecBiYFY/1r3fOVfknCvKzs4+qjhuOWsmKQm+HmUpCT5uOWvmUW1306ZNB++vA1izZg35+flUV1cfTPba2trYsGFDn9v54IMPmDp1KjfeeCMrVqxg7dq1PerT09PZvz9wlwkz4zOf+Qxf+cpXyM/PJzMzs9cyh68/fvx4xo8fz7e+9S2uvPLKkP9eERERGd7OyB/H419YSlZaUkjL1zW3sWV3A4s0kbpIRMW06cY5V2tmfwWWAqPMLN5r3csDjm6UlBB0jboZ7tE4GxoauOGGG6itrSU+Pp7p06dz//33c80113DjjTdSV1dHe3s7N998M3PmzAm6nccff5zf/va3JCQkkJOTw9e//vUe9QUFBfh8PubPn88VV1zBggULetRffPHFnHDCCTz44IMBt3/FFVdw7bXXkpKSwltvvUVKSgqXXXYZ1dXV5OfrZmkREREJzbiMZMZlJB95Qc+aj2pxmkxdJOKsP32rw7JDs2ygzUv0UoCX8A/OcjnwR+fco2Z2H7DWOffzvrZVVFTkiouLe5SVlZUpUTkK119/PQsWLODqqwOPj6PjKyIiIoG8saWa2qY2zp1/5CmdfvTyZn76ly2sve0s0pJ024jI0TCzEudcwPnXYvHqygUe8u7biwMed849a2bvAY+a2beA1cCvYxDbsLZo0SJGjBjBD3/4w1iHIiIiIoPMw//Yzqaq/SEleykJPpbNHKtETyTCov4Kc86tBRYEKP8A//17EiMlJSWxDkFEREQGqVm56bz4XiVNre2kJvb9EfOLp04DpkUnMJFhLCYDtIiIiIjI0JKfm4FzsKmy7/n2Ojpdv6ZoEJGBU7InIiIiIkctPycDgI1HSPYeW/URS7/7F/Y0HIhGWCLDmpI9ERERETlqeaNTSEuKP2LLXsm2Gto6OskckRilyESGL90VKyIiIiJHLS7O+PNXPsHY9L7n2lu9vYaFk0ZjZlGKTGT4UsteBPh8PgoLC5k7dy6f/exnaWpqClq+bNkyXnzxxR7r33PPPXzxi1+MRegiIiIiA5YzMpm4uOBJ3L7GVj7Y08hCTaYuEhVK9tY+DnfPhdtG+X+vffyoN5mSksKaNWtYv349iYmJ3HfffUHLL7nkEh599NEe6z/66KNccsklRx2HiIiISDRtqtzPrX9cS0Vdc8D60m01ACycOCqaYYkMW8M72Vv7OPzpRqj7CHD+33+6MSwJX5eTTz6ZrVu3Bi2/8MILee6552htbQWgvLycXbt2cfLJJ4ctBhEREZFoaDjQzqOrPmL9zvqA9bmjkrl86SQK8pTsiUTD0L9n74HlvcvmnAeL/w3+fDu0HfbNU1szPP9VKLgIGvfC4//Ss/7K50LedXt7O88//zyf+tSngpaPGTOGxYsX8/zzz7NixQoeffRRLrroIvVjFxERkUFnVk46ZlBWUc8nZ4/rVT9n/EhuXzEyBpGJDE/Du2Wvfmfg8uZ9R7XZ5uZmCgsLKSoqYuLEiVx99dV9lnfvyqkunCIiIjJYjUiKZ9KYVMoqerfstXd0sn5nHe0dnTGITGR4Gvote321xI3M87pwHl5+nP/3iMx+teR16bo3L9TyFStW8OUvf5nS0lKamppYtGhRv/cpIiIiciyYlZMRcK69jZX7+fRP/sZPLlnAufPHxyAykeFneLfsnf5NSEjpWZaQ4i+PorS0NJYtW8ZVV12lVj0REREZ1OaMz8CAtsNa8Eq6BmeZpJE4RaJleCd7BRfBuT/2WvLM//vcH/vLo+ySSy7h3XffVbInIiIig9r1p03nL/9xKgm+nh8zS7fXMC4jifEjk2MUmcjwM/S7cR5JwUVhT+4aGhr6VQ5w3nnn4ZwLaxwiIiIi0RZskLmSbTUs0mTqIlE1vFv2RERERCTsbnxkNT96efPB57vrW9hR06zJ1EWiTC17IiIiIhJWu2qb/ROrf3IGABkpCfzmqsVMzR4R48hEhhe17ImIiIhIWOXnZrCxYv/BW1SSE3ycMiObvNGpMY5MZHhRsiciIiIiYTUrN539B9rZUdMMwGOrtrPmo9oYRyUy/CjZExEREZGwys/NAKCsop4D7R38v6c38H/rKmIclcjwo2RPRERERMJq5rh0Fk8ZQ0J8HBt21dPa3snCiaNiHZbIsKNkLwJ8Ph+FhYUHf8rLy9m7dy/Lli0jLS2N66+/PtYhioiIiETMiKR4Hv/CUpbNHEtp12TqGolTJOqG/Wicz33wHPeW3ktlYyU5I3K4aeFNLJ+6/Ki2mZKSwpo1a3qUNTY2cscdd7B+/XrWr19/VNsXERERGQzaOzop3V5D3ugUxmZoMnWRaBvWyd5zHzzHbW/eRktHCwAVjRXc9uZtAEed8B1uxIgRfPzjH2fr1q1h3a6IiIjIseh3/9jGHc++x6jUBJZMyYx1OCLDUtSTPTM7DvgNMA5wwP3OuXvNbAzwGDAZKAcucs7VHO3+rnzhyl5lZ00+i8/N+hz3lNxzMNHr0tLRwnff+S7Lpy6npqWGr7z6lR71D3zqgSPus7m5mcLCQgCmTJnCypUrj+IvEBERERl8Pqxu4EB7J7vrD7CqfB9Prd7JeQsmxDoskWElFi177cC/O+dKzSwdKDGzl4ErgFecc98zs1uBW4GvRjKQqqaqgOV1B+qOaruBunGKiIiIDBdPrd7J797eDvi/2a+oa+FrT64DUMInEkVRT/accxVAhfd4v5mVAROAFcCp3mIPAa8ShmSvr5a4nBE5VDT2HgY4d0QuAKOTR4fUkiciIiIih9z14iYOtHf2KGtu6+CuFzcp2ROJopiOxmlmk4EFwNvAOC8RBKjE380z0DrXmFmxmRVXV1cf1f5vWngTyb6eNwsn+5K5aeFNR7VdERERkeFsV21zv8pFJDJiNkCLmaUBfwRuds7Vm9nBOuecMzMXaD3n3P3A/QBFRUUBlwlV1yAs4R6NM5jJkydTX19Pa2srTz31FC+99BKzZ8+OyL5EREREYmX8qBR2Bkjsxo9KiUE0IsNXTJI9M0vAn+g97Jx70iuuMrNc51yFmeUCu6MRy/Kpy8Oe3DU0NAQsLy8vD+t+RERERI5Ft5w1k689uY7mto6DZSkJPm45a2YMoxIZfqLejdP8TXi/Bsqccz/qVvUMcLn3+HLg6WjHJiIiIiJH77wFE/ju+fOYMCoFAyaMSuG758/T/XoiURaLlr2PAf8MrDOzriErvw58D3jczK4GtgEXxSA2EREREQmD8xZMUHInEmOxGI3zb4AFqT49mrGIiIiIiIgMVTEdjTNSnDuqcVskCB1XEREREZHBY8gle8nJyezdu1eJSZg559i7dy/JyclHXlhERERERGIuZlMvREpeXh47duzgaOfgk96Sk5PJy8uLdRgiIiIiIhKCIZfsJSQkMGXKlFiHISIiIiIiElNDrhuniIiIiIiIKNkTEREREREZkpTsiYiIiIiIDEE2mEetNLNq/BOwH2uygD2xDqKfFHPkDbZ4QTFHy2CLebDFC4o5WgZbzIMtXlDM0aKYI2+wxQvHbsyTnHPZgSoGdbJ3rDKzYudcUazj6A/FHHmDLV5QzNEy2GIebPGCYo6WwRbzYIsXFHO0KObIG2zxwuCMWd04RUREREREhiAleyIiIiIiIkOQkr3IuD/WAQyAYo68wRYvKOZoGWwxD7Z4QTFHy2CLebDFC4o5WhRz5A22eGEQxqx79kRERERERIYgteyJiIiIiIgMQUr2gjCz/zWz3Wa2vltZoZn9w8zWmFmxmS32ymeZ2VtmdsDM/qPb8jO9Zbt+6s3sZq/usW7l5Wa2JhIxe+U3mNlGM9tgZt/3yi47LLZO7+9LP6x8j5nd461zrZmt88r/Zmazoxlzt7qJZtZw2LH+srfsejN7xMySvfJfm9m7ZrbWzJ4ws7RIxGxm871zYJ2Z/cnMMrzyTDP7qxfvT4Ns75nDtjXGzF42sy3e79ERirlf57NXF/A4d6v/sZk1RCjeoK8ZM/uamW01s01mdla38vJu52xxt/K7vPNrrZmtNLNRkYjZKw/59efVXezFtcHM7uy2nSvMrLrbOv8aiZiDncteXbDjfJN3Tmww7xrnlUfrXO7zehrkmhHs3LjDO/5rzOwlMxsf7ni98pCvcWZ2nHcdec9b/qZuy0brGIfzvAjrMQ4Ws1fe39ffJd7fuNbMXjCzrL62FaV4J5tZc7d47+u2/Avmf4/bYGb3mZnPKw/6/4pSzJ80sxJv/yVmdppX3tdnjK945/haM3vFzCZFIuYBnsvBPmOcbmalduhz0fRoxmxmCWb2kFdeZmZf88qTzeydbufG7d22NcXM3vb+zsfMLDHc8XrlIZ8XXl2imd1vZpu99S7wyqPy3tffmI9wLof98/JRcc7pJ8APcAqwEFjfrewl4Gzv8TnAq97jscAJwLeB/wiyPR9QiX8ejMPrfgh8M0IxLwP+DCR1xRpgvXnA+0G2WQKc4j3O6Fb+T8ALsYgZeAL4Q9exBiYAHwIp3vPHgSsCxPwj4NYIxbwK+IT3+CrgDu/xCODjwLXATwNs63zg94dt6/tdcQK3AnceC+dzX8fZe14E/BZoiES8h9UffM0As4F3gSRgCvA+4PPqyoGsAOufCcR7j++M4DHu1+sPyAS2A9ne84eA073HVwQ6h6J4Lgc8zsBcYD2QCsR7f+/0aJ7Lwc6NbmU9rhlHODe6XzNuBO6L9nlxeLxALrDQe5wObAZmR/MYh/m8COsxHuhx9sq6v/7igd1d54V3bG8LdVuRiheY3Mf5nuH9NuCPwOf6+n9FMeYFwHjv8VxgZ5Btdv+MsQxI9R5/EXjsGDmX+/qMsRnI9x5fBzwY5ZgvBR71Hqfiv65N9s6HNK88AXgbOLFb/F3nyX3AF4+F8wK4HfiW9ziOQ6/DK4jOe184z+Wwf14+mh+17AXhnHsd2Hd4MdD1DdBIYJe37G7n3CqgrY9Nno7/DaXHJPBmZsBFwCMRivmLwPeccwe6Yg2w6iXAo4cXmtkM/B/83/DWre9WPQL/8YhqzGZ2Hv6L7obD1okHUswsHv8Fr+t/U++tZ0BKBGOeAbzuPX4ZuMBbttE59zeg5fDtmL+V8SvAtw6rWoH/Qz7e7/MiFPNAzueAx9n83ybfBfzn0cbaR7x4+zr8NbMC/5vdAefch8BWYPERtv+Sc67de/oPIC9CMff39TcV2OKcq/ae/xnvXIqE/pzLBD/O+cDbzrkm75i+hv9LjK51onEuA4Gvp31cM4JtP6zXuXBc45xzFc65Uu/xfqAM/wdQiN4xDtt5cSy8l3TT/fVn3s8I71zKwLvGhbitaMR7+Ha6jmU8kMihYxns/xWVmJ1zq51zXcduA/73jaTuKwb4jPFX51yTVx3J63J/z2UI8t5HkPfRKMbs8J+v8fg/47QC9c6vq5dNgvfjvPP6NPxfKEEYrhlhPC+uAr7rLdfpnIvYxOVROJfDfo07Gkr2+udm4C4z+wj4AfC1fqz7OQIndCcDVc65LWGIL5AZwMlek/1rZnZCgGUuDhLb5/B/s3bwJDWzL5nZ+/i/8bwxIhEHidlLjr6K/9ufg5xzO/H/P7YDFUCdc+6lbjE/gL9VdRbwkwjFvAH/GwXAZ4HjQljnDvytEE2HlY9zzlV4jyuBcWGJsLd+nc9HOM7XA890izuSDn/NTAA+6la/g0MfhB3wktf14pog27sKeD4ikfb/9bcVmGn+blvx+N+Eu59LF9ihLsmhnGMDEexcDnac1+P/GzPNLBV/K3HXOtE6l7v0ODeCXTM8Qc8NM/u297q4DPhmBOLs1zXusNgm4/+m+W2vKFrHOJznRTSOMfTz9eeca8P/gW8d/g/ts4Ff92NbkYx3ipmt9spP7r6Smb2Iv0VyP4c+xA/kPSncMXe5ACjt+hDdTa/PGN1cTeSuy/06l4/w3vevwP+Z2Q7gn4HvRTnmJ4BGL67twA+cc/vA/yWs+bu07wZeds69jb/3SG23Lzu7v1+GU7/OCzt0K8Ud5u8W+wcz634ti8Z7X1jP5Sh9Xg6Jkr3++SLwZefcccCXOfQm0Cfz94f+J/zdcg53CWFo1etDPDAGOBG4BXjc+2anK7YlQJNzbn2AdXslqM65nznnpuH/QPJfUY75NuDubt9WAWD+e1RW4O92MR7/t1yf7xbzlV55Gf439ki4CrjOzErwd7Nq7Wth898fMs05t7Kv5bwLR6S+EerX+RzsOJv/fpvPErlE+nD9ec183Dm3EDgb+JKZndK90sy+AbQDD4c3xIP69fpzztXgdV/C/w1hOdDhLf4nYLJzrgD/N7tdrTnh1q9z2TlXhr8r7EvAC8CabjF3Xy6S53KXw8+N2whwzfAEPTecc9/wXhcP4/8iI9z6dY3r4iWDfwRuPuyb4664I3mMw3peROEYQz9ff2aWgP/1twD/NW4th74E63NbEY63ApjonFuAvzfI763bfWbOubPwd/VNwt9qA/38f0UgZgDMbA7+8+ALAdYN+CW49/5dhL+3SCT09/26r88YXwbOcc7lAQ/gv10kmjEvxv+6Gu/F9+9mNhXAOdfhnCvE30K62MzmRii2QPp7XsR7cb7pXZffwp9gQ/Te+8J6Lkfp83JIlOz1z+XAk97jP3CErmLdnI3/m4Cq7oXeN/fn4/9gFyk7gCe9Jv13gE4gq1t9sIvtfPz3NJUE2e6jhKG7UBDBYl4CfN/MyvG3Sn3dzK4HzgA+dM5Ve9/MPgmc1H2DzrkOL+aIdIlzzm10zp3pnFuE/3i+f4RVlgJF3t/yN2CGmb3q1VWZWS6A9/uougv1ob/nc7DjvACYDmz1/p5UM9saiYCDvGZ20vNb6zyvrKs1sqs7xkq6/Y1mdgXwaeCyIN8sh0O/X3/OuT8555Y455YCm/DfE4Jzbm+3bxN/BSyKRMB9nMt9HedfO+cWOedOAWq6YiZ653KwcyPYNaPPc6Obh4nMNaO/17iuROSPwMPOuSe7bSsqxzpNdKwAAAc+SURBVDjM50V3kTrG0P/XXyGAc+5975rwOIfeS460rYjF6/zdCvd6sZXgP/Yzuq/onGsBnsZr/RnAe1JYYwYwszz8r61/cc712H+wzxhmdgbwDeCfXO/Wk7AYwLkc8L3PzLKB+c7fYgb+a0+Pzx5RiPlS/PeDtXnXsr/jT5S7r1sL/BX4FLAXGOVdL7v/jeHW3/NiL/5eTt0/kyz04o/Ke98AYsari+Xn5ZAo2eufXcAnvMenAaF2vQzWEnEGsNE5tyMMsQXzFP6bTrv6FCcCe7zncfjvb+l1vx4BYjaz47s9XU7of39/BYzZOXeyc26yc24ycA/wHefcT/F3XTjRzFK9b2FOB8rMb7q3HcPfuroxEgGb2Vjvdxz+b3Du62t559wvnHPjvb/l48Bm59ypXvUz+BMxvN9PRyJm+n8+BzzOzrnnnHM53f43Tc65ox6RLIhAr5lngM+ZWZKZTYH/v727iZWzquM4/v1FtGKroPWNGErTiNSCVaFEjE1EfIkxCDHpwpcFrAiRhYmJbmhITUxYGgOp74YFRI0vC9SN1ngTbUAg9d5LW0qtjVoQDV0QwqZEPS7OGe/T6dx7mevM3Obh+0kmM3PmnOf5zzPneTnPeZ4zXA48kmRjktcCJNlIHZRlcAb/49T7C28qS/eITMPY61+nLr2eesP/d9v7SzrZbqL2VE/cCnV55HIeKrOFpUGHBmVmUZdhRN1YbpuxSt3obuduZjrbjLG2cW19+x51fRvuOZjJMp5kvZjRMobx17+ngR3tIB7goyytZ8tOa9rxJnlTlkbZ3EZdxieTbOo09C+g7pePtfdj7ZOmEPPFwC+pgwcdHFFu1DHGe4FvUbfL0zwxNG5dHrnvo57AuKh9bzi7vswq5r/RenPbtuw64FirMxe39AtbbMfaSYzfAnta+WltM8aqFy2unwPXt6QPA0db+Zns+8aNuWM9j5dfmrKOo8Oczw/qD/cMdZCKp6jXj++mjrazQL1f4pqW960tz/PAc+31YISsjdQzFheNmMd9wO1TjvlVwP3UA5lDwA2d/NcDDy8zrZPA9qG0r1OvG5+nbiyunHXMnXL7OHtkva9Qd3KHqSNCbqCezDhIvf/iMPUM8uumFPMXqGetj1Ov2U8n/1+oNwK/0PLvGJreVs4eEWoz8BvqxuEA8IbzqD6fs5xHzGsSo3GeE+9K6wz1TPCfqT1hgxFGt7XvttDq7Z2d/Ceo92bMt8ckRgOcyPrXpnO0PT7dSb+7fY8F6vq3fUoxr1SXz1nOLf13Ld4F2uihs6zLK9WNTrl9LI1uuVLd+Gn7vRapBx9vm2W9WCbe3dTLMxc7dfYTs1zGE64XE13GE17/bqceTA5i29zSV/3NphUvtedzsO89BHyypb+FOkrjYitzD0ujDC/7e80o5r3Ue8nmO483d6Y16hjjAPDPTv4Hz6O6PHLfB3yKeoyxAMwB22YZM7CJ2gt2hLqufaml7wT+2Kkbd3Wmv43aiD3Ryp6zH1+PegFcRh2EZpG6TdvS0me175tkXZ748fL/8xhUFkmSJElSj3gZpyRJkiT1kI09SZIkSeohG3uSJEmS1EM29iRJkiSph2zsSZIkSVIP2diTJPVWkjuTHEmymGQ+yfumPL+5JLtWz/m//Pcl2dMp+2SL9ViSewf/lSVJ0lrY2JMk9VKS9wM3AleXUnZS/3j91PpGtarPtVh3AmeY7h/RS5J6zsaeJKmvLgFOl1LOAJRSTpdS/g6Q5K4kjyY5nOTbSdLS55J8LcljSZ5Icm2SnyX5U5KvtjxbW8/bAy3PT5K8ZnjmST6W5KEkh5L8OMmmlxp4KeVF4MvAliTvnsCykCS9DNnYkyT11a+AS5McT7I/yQc7n91bSrm2lHIVcCG1B3DgxVLKLuCb1J61O4CrgFuTbG55rgD2l1LeCTwPfL474yRvBPYCHymlXA08BnxxnOBLKf8GFoDt45STJGnAxp4kqZdKKS8A1wC3Ac8CP0pya/v4Q0n+kORx4Abgyk7RB9vz48CRUsozrXfwJHBp++xUKeVge30/sHto9tcBO4CDSeaBW4DL1vA1soYykiQBcMF6ByBJ0rS03rE5YK417G5J8kNgP7CrlHIqyT7g1Z1iZ9rzfzqvB+8H+80yPKuh9wF+XUr5zFpjT/IK4F3AE2udhiTp5c2ePUlSLyW5IsnlnaT3AH9lqWF3ut1Ht2cNk9/SBoAB+Czw+6HPHwY+kOTtLZaNSd4xRuyvBO6m9iAuriE+SZLs2ZMk9dYm4J729wX/Ak4At5VSnkvyHeAw8A/g0TVM+0ngjiTfB44C3+h+WEp5tl0y+oMkG1ryXuD4KtN9IMkZYANwALh5DbFJkgRAShm+8kSSJC0nyVbgF21wF0mSzltexilJkiRJPWTPniRJkiT1kD17kiRJktRDNvYkSZIkqYds7EmSJElSD9nYkyRJkqQesrEnSZIkST1kY0+SJEmSeui/8PcSR5D29t0AAAAASUVORK5CYII=\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "plt.figure(figsize=(15,5))\n",
        "plt.xlabel('Sample ID')\n",
        "plt.ylabel('Percentage')\n",
        "\n",
        "plt.plot(sample_ids, df_sen['ECG1'], label='Sensitivity', marker='o', linestyle='--')\n",
        "plt.plot(sample_ids, df_ppv['ECG1'], label='PPV', marker='o', linestyle='--')\n",
        "plt.plot(sample_ids, df_f1[ 'ECG1'], label='F1', marker='o', linestyle='--')\n",
        "\n",
        "plt.legend()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "SHE7WpnlR6ZY",
        "outputId": "fef61dc8-aa07-4224-c7f9-90f0e9081d7e"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(88.70252930995336, 94.52263293614219, 90.48624490723604)"
            ]
          },
          "execution_count": 43,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "np.average(to_float(sensitivity)), np.average(to_float(ppv)), np.average(to_float(f1))"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "base",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.7"
    },
    "orig_nbformat": 4,
    "vscode": {
      "interpreter": {
        "hash": "51480fad90fe9d21f60dbdf1474e71297e9cf7d519346d7c8ab062a40f50e1c0"
      }
    },
    "colab": {
      "provenance": [],
      "collapsed_sections": [
        "fRjCYnF-R6ZS",
        "h5IcQzxER6ZV",
        "k2eru3swWXMG"
      ],
      "include_colab_link": true
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}